ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZTg3OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvYXJjaGl2ZWQudHh0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvYXJjaGl2ZWQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTdjMzIxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL2FyY2hpdmVkLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVGhpcyBmZWF0dXJlIGlzIG5vIGxvbmdlciB1c2VkLCAKLXNvIEkgaGF2ZSAibnVsbGVkIG91dCIgdGhlIGhlYWQgc3RyZWFtIAotdG8gYXZvaWQgY29uZnVzaW9uLiAKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YjQ2MTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWRhNjhhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIEVudGVycHJpc2UgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KU1QgZW50ZXJwcmlzZSB0ZXN0cwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTczN2Y3Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmFiZmI0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyZWE1ZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjOTcxOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFdlYiBUZXN0cwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpTVCBXZWIgdGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGNlOWRmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudGVzdHMuZW5jb2RpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVzdHMucGVyZm9ybWFuY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0udGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgICAgIAotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3N2Y0NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamF2YXRlc3RzLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InZtX3Rlc3RzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ2M2FmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ1OTViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmplbS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJkMDc3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIEFwciAxNSAyMToxMDowMyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyZGFlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLSNTYXQgTWFyIDMxIDIzOjE1OjQ5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NWUxMzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNUdWUgRmViIDIxIDEwOjA5OjE4IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZm9ybWF0dGVyX3Byb2ZpbGU9X2p2ZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTAKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9amF2YTtqYXZheDtvcmc7b3JnLmVjbGlwc2Uud3RwO29yZy5lY2xpcHNlLmplbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZG07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RlO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmpjbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qYXZhO29yZy5lY2xpcHNlLnZlO2NvbTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL0JlYW5JbmZvIEFsbFN1aXRlcyB3aXRoIFJlbW90ZSBEZWJ1Zy5sYXVuY2ggYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvQmVhbkluZm8gQWxsU3VpdGVzIHdpdGggUmVtb3RlIERlYnVnLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlNWM4MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvQmVhbkluZm8gQWxsU3VpdGVzIHdpdGggUmVtb3RlIERlYnVnLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkp1bml0TGF1bmNoQ29uZmlnIj4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwcm9kdWN0IiB2YWx1ZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0uaWRlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZVByb2R1Y3QiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InZtaW5zdGFsbCIgdmFsdWU9ImpkazEuNC4yXzA1Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkNPTlRBSU5FUiIgdmFsdWU9IiIvPgotPG1hcEF0dHJpYnV0ZSBrZXk9InRyYWNpbmdPcHRpb25zIj4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9jb21wYXRpYmlsaXR5L2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3BhcnNpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9pb2NvbnNvbGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC5iYXNlL2RlYnVnL3NlYXJjaCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1Zy9sb2NhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2ZpbHRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9tb25pdG9yL2J1aWxkZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvcGFja2FnZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9zdWNjZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvZGVidWcvY29udGV4dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL21vbml0b3IvY2xhc3NlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0vZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaW5kZXhtYW5hZ2VyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvY3ZzcHJvdG9jb2wiIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnL2NhY2hlY29weSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3ByZWZpeGVzL3N1Y2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnL2V2ZW50cy9wbHVnaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvYnVpbGRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9oaWVyYXJjaHkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvbW9uaXRvci9saXN0ZW5lcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9wcmVmaXhlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL3RyZWUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9rZXlCaW5kaW5ncy52ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFkZWx0YS92ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3JlY29uY2lsZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9tYXN0ZXJ0YWJsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdGltaW5nL3N0YXJ0dXAiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvY29udGV4dHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9hY3RpdmF0ZXBsdWdpbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuZGVidWcvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zZWxlY3Rpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMvZXJyb3JvbmRlYWRsb2NrIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2J1ZmZlcm1hbmFnZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uvd29ya2JlbmNoLnJlc3RvcmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9maWx0ZXIvbmF0aXZlIiB2YWx1ZT0iKiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvc25hcHNob3RzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NvbXBpbGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvYWN0aXZhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL21ldGFmaWxlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnL2luZm9wb3AiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9tb25pdG9yYnVuZGxlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy91aWpvYi5sb25nd2FybmluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL21ldGFpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvaW50ZXJuYWxlcnJvci9vcGVuRGlhbG9nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFtb2RlbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL2RlYnVnL2FsbFR5cGVzQ2FjaGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9mYWlsdXJlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQvZGVidWcvQ29udGVudEFzc2lzdFN1YmplY3RBZGFwdGVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2V2ZW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby90cmFjZS9wcmludEhUTUwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9zZXJ2aWNlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy90eXBlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC5iYXNlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnL2V2ZW50cy9leHRlbnNpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1Zy9wbGF0Zm9ybWFkbWluIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL2RlbHRhIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvY29uZmlndXJhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wYXJ0LmFjdGl2YXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvbm90aW1lb3V0cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnL2VtYmVkZGVkQnJvd3NlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhZGVsdGEiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9tYW5pZmVzdCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3NlY3VyaXR5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2tleUJpbmRpbmdzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvbWFya2VycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdGltaW5nL3NodXRkb3duIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51aS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcC9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy92ZXRpbWV0cmFjZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wYXJ0LmNyZWF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbGl2ZXdpbmRvdyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2NyZWF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3N0YXJ0bGV2ZWwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9wcmVmaXhlcy9mYWlsdXJlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3dvcmtiZW5jaC5zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycy52ZXJib3NlLmNvbW1hbmRJZCIgdmFsdWU9IiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuYW50LmNvcmUvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL2RpcnR5Y2FjaGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL21ldGFpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbGhhbmRsZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9idW5kbGVUaW1lIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmlsdGVyL2xvYWRlciIgdmFsdWU9IioiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL25lZWRidWlsZCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnL2VtYmVkZGVkQnJvd3Nlci9pbnByb2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9zeW5jaW5mbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9pbnZva2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL3N5bmNjaGFuZ2VldmVudHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9hY3Rpb25zIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvL3RyYWNlL2xvZ0luZm8iIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZpbHRlci9yZXNvdXJjZSIgdmFsdWU9IioiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL2ZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2ViIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3JlZnJlc2giIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9sb2FkZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9tb25pdG9yL2FjdGl2YXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMudmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3BhY2thZ2VhZG1pbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zZWFyY2giIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL3N0cmVhbXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9wYWNrYWdlYWRtaW4vdGltaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzL2JlZ2luZW5kIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2luc3RhbGwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9kZWJ1Z3ZtIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvaGlzdG9yeSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcveG1sdGV4dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvcG9zdGFjdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL3RocmVhZGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy96aXBhY2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1Zy9wbGF0Zm9ybWFkbWluL3Jlc29sdmVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvbWFya2VycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL3ZtdHJhY2VvdXQiIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL3RyZWUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2FybmluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvY29udGVudHR5cGVzL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvdHJhY2VQcm9wZXJ0eVJlc29sdmluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnL2NhY2hlbG9va3VwIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1Zy9kdW1wIiB2YWx1ZT0iIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0vZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5wZGUuYnVpbGQvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcHJlZmVyZW5jZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9jbGFzc0xvYWRpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMvdGltaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9zeW5jaW5mbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2ZpbHRlcnMiIHZhbHVlPSJ0cmFjZS5wcm9wZXJ0aWVzIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9IldBUk5JTkciLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2dyYXBoaWNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1Zy9BU1RQcm92aWRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2NvbmZpZy9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnL2Nvbm5lY3QiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL3JlZnJlc2hqb2IiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9wcm9wZXJ0aWVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BhcnQubGlzdGVuZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaC9zc2hfcHJvdG9jb2wiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL2JhY2tncm91bmRldmVudHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMvbG9ja3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvbmF0dXJlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9jb250ZXh0cy52ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvbWFzdGVydGFibGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3ByZWZlcmVuY2VzL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BlcnNwZWN0aXZlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL2pvYi5zdGFsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jcHJlc29sdXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9zbmFwc2hvdHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY29tcGxldGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL21vbml0b3IvcmVzb3VyY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAud2ViYXBwL2RlYnVnL3dvcmtpbmdzZXRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2RlYnVnL3BsdWdpbnN0b3BwZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9jb252ZXJ0ZXIvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC9kZWJ1Zy9jb250ZXh0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1Zy9yZXNvbHZlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvZmlsZW5hbWUiIHZhbHVlPSJydW50aW1lLnRyYWNlcyIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC9kZWJ1Zy9Bbm5vdGF0aW9uUGFpbnRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwL2RlYnVnL3Byb3RvY29scyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZpbHRlci9jbGFzcyIgdmFsdWU9IioiLz4KLTwvbWFwQXR0cmlidXRlPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InNlbGVjdGVkUGx1Z2luIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnByb3h5Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5LRUVQUlVOTklOR19BVFRSIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnByb3h5Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYXBwbGljYXRpb24iIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUuanVuaXQucnVudGltZS5jb3JldGVzdGFwcGxpY2F0aW9uIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3MiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5NQUlOX1RZUEUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uQmVhbkluZm9TdWl0ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImxvY2F0aW9uMSIgdmFsdWU9IkQ6XHJ1bnRpbWUtanVuaXQtdGVzdC13b3Jrc3BhY2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ2bWFyZ3MiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJDb25maWciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwcm9nYXJncyIgdmFsdWU9Ii1vcyB3aW4zMiAtd3Mgd2luMzIgLWFyY2ggeDg2IC1ubCBlbl9VUyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUTkFNRSIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFza2NsZWFyIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImxvY2F0aW9uMCIgdmFsdWU9IkQ6XHJ1bnRpbWUtanVuaXQtdGVzdC13b3Jrc3BhY2UiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9CZWFuSW5mbyBBbGxTdWl0ZXMubGF1bmNoIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL0JlYW5JbmZvIEFsbFN1aXRlcy5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODdhOGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL0JlYW5JbmZvIEFsbFN1aXRlcy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5KdW5pdExhdW5jaENvbmZpZyI+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icHJvZHVjdCIgdmFsdWU9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLmlkZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VQcm9kdWN0IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ2bWluc3RhbGwiIHZhbHVlPSJKOV8xNDJfMjAwNDA5MjYiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuQ09OVEFJTkVSIiB2YWx1ZT0iIi8+Ci08bWFwQXR0cmlidXRlIGtleT0idHJhY2luZ09wdGlvbnMiPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2NvbXBhdGliaWxpdHkvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvcGFyc2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UvZGVidWcvc2VhcmNoIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvaW9jb25zb2xlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnL2xvY2F0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvZmlsdGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL21vbml0b3IvYnVpbGRlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9wYWNrYWdlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3N1Y2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9kZWJ1Zy9jb250ZXh0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvbW9uaXRvci9jbGFzc2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2luZGV4bWFuYWdlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0vZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9jdnNwcm90b2NvbCIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY2FjaGVjb3B5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvcHJlZml4ZXMvc3VjY2VzcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWcvZXZlbnRzL3BsdWdpbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9idWlsZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2hpZXJhcmNoeSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3ByZWZpeGVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL21vbml0b3IvbGlzdGVuZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvdHJlZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9rZXlCaW5kaW5ncy52ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvcmVjb25jaWxlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhZGVsdGEvdmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL21hc3RlcnRhYmxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS90aW1pbmcvc3RhcnR1cCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9jb250ZXh0cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuZGVidWcvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2FjdGl2YXRlcGx1Z2luIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlbGVjdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icy9lcnJvcm9uZGVhZGxvY2siIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvYnVmZmVybWFuYWdlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS93b3JrYmVuY2gucmVzdG9yZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZpbHRlci9uYXRpdmUiIHZhbHVlPSIqIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9zbmFwc2hvdHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY29tcGlsZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9hY3RpdmF0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvbWV0YWZpbGVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWcvaW5mb3BvcCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL21vbml0b3JidW5kbGVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL3Vpam9iLmxvbmd3YXJuaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvbWV0YWluZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy9pbnRlcm5hbGVycm9yL29wZW5EaWFsb2ciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFtb2RlbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL2RlYnVnL2FsbFR5cGVzQ2FjaGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC9kZWJ1Zy9Db250ZW50QXNzaXN0U3ViamVjdEFkYXB0ZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvL3RyYWNlL3ByaW50SFRNTCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2V2ZW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3NlcnZpY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3R5cGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWcvZXZlbnRzL2V4dGVuc2lvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnL3BsYXRmb3JtYWRtaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvZGVsdGEiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9jb25maWd1cmF0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BhcnQuYWN0aXZhdGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9ub3RpbWVvdXRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWcvZW1iZWRkZWRCcm93c2VyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFkZWx0YSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL21hbmlmZXN0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2tleUJpbmRpbmdzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvc2VjdXJpdHkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9tYXJrZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS90aW1pbmcvc2h1dGRvd24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC53ZWJhcHAvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvdmV0aW1ldHJhY2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BhcnQuY3JlYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9saXZld2luZG93IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvY3JlYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvc3RhcnRsZXZlbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3ByZWZpeGVzL2ZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uvd29ya2JlbmNoLnN0YXJ0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2hhbmRsZXJzLnZlcmJvc2UuY29tbWFuZElkIiB2YWx1ZT0iIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5hbnQuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvZGlydHljYWNoaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvbWV0YWluZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsaGFuZGxlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2J1bmRsZVRpbWUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9maWx0ZXIvbG9hZGVyIiB2YWx1ZT0iKiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvbmVlZGJ1aWxkIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvc3luY2luZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9lbWJlZGRlZEJyb3dzZXIvaW5wcm9jZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL2ludm9raW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvc3luY2NoYW5nZWV2ZW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2FjdGlvbnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8vdHJhY2UvbG9nSW5mbyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmlsdGVyL3Jlc291cmNlIiB2YWx1ZT0iKiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2ViIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL2ZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVmcmVzaCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2xvYWRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL21vbml0b3IvYWN0aXZhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycy52ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvcGFja2FnZWFkbWluIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlYXJjaCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvc3RyZWFtcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icy9iZWdpbmVuZCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3BhY2thZ2VhZG1pbi90aW1pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL2RlYnVndm0iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvaGlzdG9yeSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcveG1sdGV4dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS90aHJlYWRpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvcG9zdGFjdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy96aXBhY2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9tYXJrZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWcvcGxhdGZvcm1hZG1pbi9yZXNvbHZlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL3ZtdHJhY2VvdXQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS90cmVlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dhcm5pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2NvbnRlbnR0eXBlcy9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3RyYWNlUHJvcGVydHlSZXNvbHZpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1Zy9jYWNoZWxvb2t1cCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWcvZHVtcCIgdmFsdWU9IiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UucGRlLmJ1aWxkL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3ByZWZlcmVuY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvY2xhc3NMb2FkaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzL3RpbWluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvc3luY2luZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9maWx0ZXJzIiB2YWx1ZT0idHJhY2UucHJvcGVydGllcyIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJXQVJOSU5HIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9ncmFwaGljcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWcvQVNUUHJvdmlkZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9jb25maWcvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1Zy9jb25uZWN0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9yZWZyZXNoam9iIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvcHJvcGVydGllcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wYXJ0Lmxpc3RlbmVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gvc3NoX3Byb3RvY29sIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9iYWNrZ3JvdW5kZXZlbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzL2xvY2tzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL25hdHVyZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvY29udGV4dHMudmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL21hc3RlcnRhYmxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9wcmVmZXJlbmNlcy9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wZXJzcGVjdGl2ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy9qb2Iuc3RhbGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY3ByZXNvbHV0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvc25hcHNob3RzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2hhbmRsZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NvbXBsZXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9tb25pdG9yL3Jlc291cmNlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcC9kZWJ1Zy93b3JraW5nc2V0cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9kZWJ1Zy9wbHVnaW5zdG9wcGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvY29udmVydGVyL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAvZGVidWcvY29udGV4dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWcvcmVzb2x2ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2ZpbGVuYW1lIiB2YWx1ZT0icnVudGltZS50cmFjZXMiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQvZGVidWcvQW5ub3RhdGlvblBhaW50ZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC9kZWJ1Zy9wcm90b2NvbHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9maWx0ZXIvY2xhc3MiIHZhbHVlPSIqIi8+Ci08L21hcEF0dHJpYnV0ZT4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJzZWxlY3RlZFBsdWdpbiIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS5wcm94eSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuS0VFUFJVTk5JTkdfQVRUUiIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS5wcm94eSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImFwcGxpY2F0aW9uIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLmp1bml0LnJ1bnRpbWUuY29yZXRlc3RhcHBsaWNhdGlvbiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhcndzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuTUFJTl9UWVBFIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLkJlYW5JbmZvU3VpdGUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJsb2NhdGlvbjEiIHZhbHVlPSJEOlxydW50aW1lLWp1bml0LXRlc3Qtd29ya3NwYWNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idm1hcmdzIiB2YWx1ZT0iIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icHJvZ2FyZ3MiIHZhbHVlPSItb3Mgd2luMzIgLXdzIHdpbjMyIC1hcmNoIHg4NiAtbmwgZW5fVVMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVE5BTUUiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS50ZXN0cyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhc2tjbGVhciIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJsb2NhdGlvbjAiIHZhbHVlPSJEOlxydW50aW1lLWp1bml0LXRlc3Qtd29ya3NwYWNlIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvSmF2YSBBbGxTdWl0ZXMgd2l0aCBSZW1vdGUgRGVidWcubGF1bmNoIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL0phdmEgQWxsU3VpdGVzIHdpdGggUmVtb3RlIERlYnVnLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0NmM1Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvSmF2YSBBbGxTdWl0ZXMgd2l0aCBSZW1vdGUgRGVidWcubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuSnVuaXRMYXVuY2hDb25maWciPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2R1Y3QiIHZhbHVlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5pZGUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlUHJvZHVjdCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJ0cnVlIi8+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1RZUEVTIj4KLTxsaXN0RW50cnkgdmFsdWU9IjQiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuQ09OVEFJTkVSIiB2YWx1ZT0iIi8+Ci08bWFwQXR0cmlidXRlIGtleT0idHJhY2luZ09wdGlvbnMiPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9zeW5jY2hhbmdlZXZlbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL3RyYWNlZXhwcmVzc2lvbnN0aW1ldGhyZXNob2xkIiB2YWx1ZT0iMTAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9wZXJmL2xpc3RlbmVycyIgdmFsdWU9IjUwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvbmVlZGJ1aWxkIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpL2RlYnVnL3ZpZXdlcnMvdmlld2VyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9tb25pdG9yL2FjdGl2YXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL3BlcmYvY29udGVudF9hc3Npc3QvZXh0ZW5zaW9ucyIgdmFsdWU9IjEwMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmlkZS9kZWJ1Zy9nYyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9jb250ZW50dHlwZS9jYWNoZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy9zaG93U3lzdGVtSm9icyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL3ZtdHJhY2VvdXQiIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMvam9icy9zaHV0ZG93biIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvbW9uaXRvci9jbGFzc2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMvZ2V0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2RlYnVnL2NvbnRleHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5qb2JzL2pvYnMvbG9ja3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvc3d0ZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YW1vZGVsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbC90cmFjZS9sb2dJbmZvIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8vdHJhY2UvcHJpbnRIVE1MIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkvZGVidWcvZXZlbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFkZWx0YS92ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy90cmFjZVByb3BlcnR5UmVzb2x2aW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nL3BlcmYvcGFydGljaXBhbnRzL2NoZWNrQ29uZGl0aW9ucyIgdmFsdWU9IjMwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9wZXJmL3BlcnNwZWN0aXZlLmxpc3RlbmVycyIgdmFsdWU9IjIwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvcGVyZi9jb250YWluZXJpbml0aWFsaXplciIgdmFsdWU9IjUwMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvZmlsZW5hbWUiIHZhbHVlPSJydW50aW1lLnRyYWNlcyIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2ViIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9hY3RpdmF0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3BlcmYvcGVyc3BlY3RpdmUuc3dpdGNoIiB2YWx1ZT0iODAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9wZXJmL3BhcnQuaW5wdXQiIHZhbHVlPSIyMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQvZGVidWcvQW5ub3RhdGlvblBhaW50ZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9pbXBvcnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvZmlsdGVycyIgdmFsdWU9InRyYWNlLnByb3BlcnRpZXMiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWcvcGxhdGZvcm1hZG1pbi9yZXNvbHZlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnL2luZm9wb3AiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMvZ2VuZXJhbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvdGhyZWFkaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9wZXJmL3NlYXJjaC9wYXJ0aWNpcGFudHMiIHZhbHVlPSIzMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3BlcmYvcGFydC5saXN0ZW5lcnMiIHZhbHVlPSIyMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcmVzb2x2ZXIvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnL2VtYmVkZGVkQnJvd3Nlci9pbnByb2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9wcm9maWxlL2ltcGwiIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2dpLnByb2ZpbGUuRGVmYXVsdFByb2ZpbGVMb2dnZXIiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3BlcmYvcGFydC5jb250cm9sIiB2YWx1ZT0iODAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Byb2ZpbGUvYmVuY2htYXJrIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvY3ZzcHJvdG9jb2wiIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9wb3N0YWN0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvbm90aW1lb3V0cyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvbWFuaWZlc3QiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvcGVyZi9zZWxlY3Rpb24iIHZhbHVlPSIzMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAvZGVidWcvY29udGV4dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvcGVyZi9jb250ZW50X2Fzc2lzdF9zb3J0ZXJzL2V4dGVuc2lvbnMiIHZhbHVlPSIiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2J1aWxkZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9yZXF1aXJlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMudmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbGl2ZXdpbmRvdyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsaGFuZGxlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3N0YXJ0bGV2ZWwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YWRlbHRhIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3ByZWZlcmVuY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvdHJlZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwL2RlYnVnL3Byb3RvY29scyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9wZXJmL3NhdmUucGFydGljaXBhbnRzIiB2YWx1ZT0iNTAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9uYXR1cmVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS9kZWJ1Zy9zZWFyY2giIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWZhdWx0cHJvZmlsZS9idWZmZXJzaXplIiB2YWx1ZT0iMjU2Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Jlc29sdmVyL2N5Y2xlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9wZXJmL3ZhcmlhYmxlaW5pdGlhbGl6ZXIiIHZhbHVlPSI1MDAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS9kZWJ1Zy92aWV3ZXJzL21vZGVsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2tleUJpbmRpbmdzLnZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3BlcmYvc3VjY2VzcyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2NvbnRleHRzLnBlcmZvcm1hbmNlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9jb21wYXRpYmlsaXR5L2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL2RlY2xhcmVkSW1hZ2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnBkZS5idWlsZC9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1Zy9sb2NhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9jb250ZXh0cy52ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2xpc3RlbmVycy9JV29ya2JlbmNoUGFnZS5JUGFydExpc3RlbmVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUuam9icy9qb2JzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3BlcmYvcGVyc3BlY3RpdmUuY3JlYXRlIiB2YWx1ZT0iODAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9zb3VyY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3N0cmluZ3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvbGlzdGVuZXJzL0lXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvbWV0YWluZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvcGVyZi9wYXJ0LmFjdGl2YXRlIiB2YWx1ZT0iMjAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby51bml2ZXJzYWwvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcGVyZiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9jb250ZW50dHlwZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy9jb250cmlidXRpb25zIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL2pvYi5zdGFsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY29tcGxldGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9wZXJmL3dvcmtiZW5jaC5zdGFydCIgdmFsdWU9IjQ1MDAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2xpc3RlbmVycy9JV29ya2JlbmNoV2luZG93LklQYXJ0TGlzdGVuZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaW5kZXhtYW5hZ2VyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2xpc3RlbmVycy9JV29ya2JlbmNoV2luZG93LklQZXJzcGVjdGl2ZUxpc3RlbmVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvbG9hZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlZmF1bHRwcm9maWxlL2xvZ3N5bmNocm9ub3VzbHkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9jbGFzc0xvYWRpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC9kZWJ1Zy9GYXN0UGFydGl0aW9uZXIvUG9zaXRpb25DYWNoZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycy5wZXJmb3JtYW5jZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMudmVyYm9zZS5jb21tYW5kSWQiIHZhbHVlPSIiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvZmlsdGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1Zy9BU1RQcm92aWRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcveG1sdGV4dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5jZGUvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcC9kZWJ1Zy93b3JraW5nc2V0cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlZmF1bHRwcm9maWxlL2xvZ2ZpbGVuYW1lIiB2YWx1ZT0iIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0vZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnL2Nvbm5lY3QiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC9kZWJ1Zy9Db250ZW50QXNzaXN0U3ViamVjdEFkYXB0ZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvbWFya2VycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9ncmFwaGljcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9yZXNvbHV0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaC9zc2hfcHJvdG9jb2wiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcGVyZi9zbmFwc2hvdCIgdmFsdWU9IjUwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvcGVyZi9wYXJ0LmluaXQiIHZhbHVlPSI4MDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvL3RyYWNlL2xvZ1BlcmZvcm1hbmNlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvY29udmVydGVyL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3BlcmYvcGFydC5jcmVhdGUiIHZhbHVlPSI4MDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWcvcGxhdGZvcm1hZG1pbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnL2VtYmVkZGVkQnJvd3NlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzL3NldCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvc3RyZWFtcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9rZXlCaW5kaW5ncyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9zdGFja3RyYWNlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1Zy9UeXBlQ29uc3RyYWludHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuY2RlL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUuam9icy9qb2JzL2JlZ2luZW5kIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL2ludGVycnVwdCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9wZXJmL3Nob3dIZWFwU3RhdHVzIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvcGVyZi9jb250ZW50VHlwZXMiIHZhbHVlPSIyMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2NvbW1hbmRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL2RlbHRhIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlYXJjaCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9wZXJmL2NvbXBsZXRpb24iIHZhbHVlPSIzMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NvbXBpbGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFtb2RlbC9jYWNoZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9jb25maWd1cmF0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9jbGlwYm9hcmR0ZXh0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvbWVzc2FnZUJ1bmRsZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLm1hbmlwdWxhdGlvbi9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2xpc3RlbmVycy9JV29ya2JlbmNoV2luZG93LklQYXJ0TGlzdGVuZXIyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2xpc3RlbmVycy9JV29ya2JlbmNoUGFnZS5JUGFydExpc3RlbmVyMiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9wZXJmL3JlY29uY2lsZSIgdmFsdWU9IjEwMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAud2ViYXBwL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaGllcmFyY2h5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3JlZnJlc2giIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL2JhY2tncm91bmRldmVudHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcvcGVyZi9wYXJ0aWNpcGFudHMvY3JlYXRlQ2hhbmdlcyIgdmFsdWU9IjMwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY3ByZXNvbHV0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dhcm5pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5jZGUvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0vZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvcGFyc2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvcGVyZi9leHBsb3Jlci9tYWtlQWN0aW9ucyIgdmFsdWU9IjEwMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvc3luY2luZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvbGlzdGVuZXJzL0lXb3JrYmVuY2hXaW5kb3cuSVBhZ2VMaXN0ZW5lciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvdGhyZWFkaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY2FjaGVsb29rdXAiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvcmVjb25jaWxlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvdHJhY2VleHByZXNzaW9ucyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3NlY3VyaXR5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvZGVidWd2bSIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvc3luY2luZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9wcm9maWxlL3N0YXJ0dXAiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9zZXJ2aWNlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL21hcmtlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3ByZWZlcmVuY2VzL3BsdWdpbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL21vbml0b3IvcmVzb3VyY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvaW9jb25zb2xlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy92ZXRpbWV0cmFjZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMvam9icy90aW1pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc2VsZWN0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1Zy9SZXN1bHRDb2xsZWN0b3IiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9zbmFwc2hvdHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL3BlcmYvZXhwbG9yZXIvY3JlYXRlUGFydENvbnRyb2wiIHZhbHVlPSIxMzAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL2RpcnR5Y2FjaGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy96aXBhY2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UucGRlLmNvcmUvY2FjaGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1Zy9jYWNoZWNvcHkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9idW5kbGVUaW1lIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL29wZXJhdGlvbnMudmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL21ldGFmaWxlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvcGVyZi93b3JrYmVuY2gucmVzdG9yZSIgdmFsdWU9IjMwMDAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2V2ZW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL21vbml0b3JidW5kbGVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUuam9icy9qb2JzL2Vycm9yb25kZWFkbG9jayIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pZGUvZGVidWcvaW50ZXJuYWxlcnJvci9vcGVuRGlhbG9nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbC90cmFjZS9sb2dQZXJmb3JtYW5jZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9wZXJmL3Vpam9iIiB2YWx1ZT0iMjAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zb3VyY2VtYXBwZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkvZGVidWcvdmlld2Vycy9kZWx0YXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9nZW5lcmljcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Jlc29sdmVyL3dpcmluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9wZXJmL2phdmFkZWx0YWxpc3RlbmVyIiB2YWx1ZT0iNTAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Byb2ZpbGUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvY29udGV4dHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9pbnZva2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9IldBUk5JTkciLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3BlcmYvYnVpbGRlcnMiIHZhbHVlPSIxMDAwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvdHlwZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9vcGVyYXRpb25zIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3BlcmYvcGFnZS5saXN0ZW5lcnMiIHZhbHVlPSIyMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9wZXJmL2V4cGxvcmVyL1JlZmFjdG9yQWN0aW9uR3JvdXAiIHZhbHVlPSIxNTAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2hpc3RvcnkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL3JlZnJlc2hqb2IiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8vZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlL2RlYnVnL1JldmlzaW9uUnVsZXJDb2x1bW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9wYWNrYWdlYWRtaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9saXN0ZW5lcnMvSVdvcmtiZW5jaFBhZ2UuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuYnJvd3Nlci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL3RyZWUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvbWV0YWluZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9tYXN0ZXJ0YWJsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5wZGUuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2J1ZmZlcm1hbmFnZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9ncm91cGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pZGUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL2VuYWJsZV9uZXciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9tYXN0ZXJ0YWJsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby90cmFjZS9sb2dJbmZvIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2V4cGVyaW1lbnRhbC9tZW51cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5wZGUuY29yZS9jbGFzc3BhdGgiIHZhbHVlPSJmYWxzZSIvPgotPC9tYXBBdHRyaWJ1dGU+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJzZWxlY3RlZFBsdWdpbiIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS5wcm94eSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuS0VFUFJVTk5JTkdfQVRUUiIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJsb2NhdGlvbiIgdmFsdWU9IkQ6XHJ1bnRpbWUtanVuaXQtdGVzdC13b3Jrc3BhY2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJhcHBsaWNhdGlvbiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS5qdW5pdC5ydW50aW1lLmNvcmV0ZXN0YXBwbGljYXRpb24iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhcndzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuTUFJTl9UWVBFIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzLkFsbFN1aXRlcyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImxvY2F0aW9uMSIgdmFsdWU9IkQ6XHJ1bnRpbWUtanVuaXQtdGVzdC13b3Jrc3BhY2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMmEiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLW9zIHdpbjMyIC13cyB3aW4zMiAtYXJjaCB4ODYgLW5sIGVuX1VTIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUTkFNRSIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFza2NsZWFyIiB2YWx1ZT0idHJ1ZSIvPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuamVtLnRlc3RzIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVF9LSU5EIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LmxvYWRlci5qdW5pdDMiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9KYXZhIEFsbFN1aXRlcy5sYXVuY2ggYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvSmF2YSBBbGxTdWl0ZXMubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTk2NzkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9KYXZhIEFsbFN1aXRlcy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5KdW5pdExhdW5jaENvbmZpZyI+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icHJvZHVjdCIgdmFsdWU9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLmlkZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VQcm9kdWN0IiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9InRydWUiLz4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iNCIvPgotPC9saXN0QXR0cmlidXRlPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5DT05UQUlORVIiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljVmFsaWRhdGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEF0dHJpYnV0ZSBrZXk9InRyYWNpbmdPcHRpb25zIj4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvc3luY2NoYW5nZWV2ZW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcveG1sdGV4dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcC9kZWJ1Zy93b3JraW5nc2V0cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlZmF1bHRwcm9maWxlL2xvZ2ZpbGVuYW1lIiB2YWx1ZT0iIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZpbHRlci9sb2FkZXIiIHZhbHVlPSIqIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0vZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2FjdGlvbnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL3RyYWNlZXhwcmVzc2lvbnN0aW1ldGhyZXNob2xkIiB2YWx1ZT0iMTAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0L2RlYnVnL0NvbnRlbnRBc3Npc3RTdWJqZWN0QWRhcHRlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcGVyZi9saXN0ZW5lcnMiIHZhbHVlPSI1MDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY29ubmVjdCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL21hcmtlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvbmVlZGJ1aWxkIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2dyYXBoaWNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3Jlc29sdXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gvc3NoX3Byb3RvY29sIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3BlcmYvc25hcHNob3QiIHZhbHVlPSI1MDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvbW9uaXRvci9hY3RpdmF0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3BhY2thZ2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL3Nob3dTeXN0ZW1Kb2JzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9wcmVmaXhlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL3ZtdHJhY2VvdXQiIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvbW9uaXRvci9jbGFzc2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2RlYnVnL2NvbnRleHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9jb252ZXJ0ZXIvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1Zy9wbGF0Zm9ybWFkbWluIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWcvZW1iZWRkZWRCcm93c2VyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9wcmVmZXJlbmNlcy9zZXQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvc3d0ZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YW1vZGVsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9zdHJlYW1zIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzL2xvY2tzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2tleUJpbmRpbmdzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvL3RyYWNlL3ByaW50SFRNTCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWcvZHVtcCIgdmFsdWU9IiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL2RlYnVnL1R5cGVDb25zdHJhaW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhZGVsdGEvdmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvdHJhY2VQcm9wZXJ0eVJlc29sdmluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvZmlsZW5hbWUiIHZhbHVlPSJydW50aW1lLnRyYWNlcyIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2ViIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1Zy9yZXNvbHZlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvZGVsdGEiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9hY3RpdmF0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlYXJjaCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWcvY2hlY2tDb3JlQmluZGluZ0lzRXF1YWxUbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jb21waWxlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0L2RlYnVnL0Fubm90YXRpb25QYWludGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1Zy9ldmVudHMvcGx1Z2luIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2NvbmZpZ3VyYXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGFydC5hY3RpdmF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Jlc29sdmVyL2ltcG9ydHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9pbmZvcG9wIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvZmlsdGVycyIgdmFsdWU9InRyYWNlLnByb3BlcnRpZXMiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWcvcGxhdGZvcm1hZG1pbi9yZXNvbHZlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnL2V2ZW50cy9leHRlbnNpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51aS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAud2ViYXBwL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaGllcmFyY2h5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3JlZnJlc2giIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvYmFja2dyb3VuZGV2ZW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jcHJlc29sdXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS90aHJlYWRpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2FybmluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Jlc29sdmVyL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy9pbnRlcm5hbGVycm9yL29wZW5EaWFsb2ciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMvZXJyb3JvbmRlYWRsb2NrIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWcvZW1iZWRkZWRCcm93c2VyL2lucHJvY2VzcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Byb2ZpbGUvaW1wbCIgdmFsdWU9Im9yZy5lY2xpcHNlLm9zZ2kucHJvZmlsZS5EZWZhdWx0UHJvZmlsZUxvZ2dlciIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcHJvZmlsZS9iZW5jaG1hcmsiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvcGFyc2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcHJlZmVyZW5jZXMvZ2VuZXJhbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL3N5bmNpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvY3ZzcHJvdG9jb2wiIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9wb3N0YWN0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BlcnNwZWN0aXZlLmxpc3RlbmVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL25vdGltZW91dHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL3RocmVhZGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnL2NhY2hlbG9va3VwIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvcGFja2FnZWFkbWluL3RpbWluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9yZWNvbmNpbGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvc2VjdXJpdHkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL3RyYWNlZXhwcmVzc2lvbnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9kZWJ1Z3ZtIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvbWFuaWZlc3QiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC9kZWJ1Zy9jb250ZXh0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2J1aWxkZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9yZXF1aXJlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL3N5bmNpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmlsdGVyL3Jlc291cmNlIiB2YWx1ZT0iKiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9wcm9maWxlL3N0YXJ0dXAiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9zZXJ2aWNlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2FjdGl2YXRlcGx1Z2luIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaC9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycy52ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvbWFya2VycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbGl2ZXdpbmRvdyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsaGFuZGxlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3N0YXJ0bGV2ZWwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9pb2NvbnNvbGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9tb25pdG9yL3Jlc291cmNlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvdmV0aW1ldHJhY2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YWRlbHRhIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlbGVjdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL3RyZWUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcHJlZmVyZW5jZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uvd29ya2JlbmNoLnJlc3RvcmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGFydC5jcmVhdGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC9kZWJ1Zy9wcm90b2NvbHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9zbmFwc2hvdHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvbmF0dXJlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UvZGVidWcvc2VhcmNoIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvZGlydHljYWNoaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVmYXVsdHByb2ZpbGUvYnVmZmVyc2l6ZSIgdmFsdWU9IjI1NiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9maWx0ZXIvbmF0aXZlIiB2YWx1ZT0iKiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvemlwYWNjZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY2FjaGVjb3B5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvcHJvcGVydGllcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Jlc29sdmVyL2N5Y2xlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2NyZWF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9pbmNsdWRlLnRpbWluZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9rZXlCaW5kaW5ncy52ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvYnVuZGxlVGltZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icy9iZWdpbmVuZCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL21ldGFmaWxlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcHJlZmVyZW5jZXMvZ2V0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcGVyZi9zdWNjZXNzIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9ldmVudHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2NvbXBhdGliaWxpdHkvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvZGVjbGFyZWRJbWFnZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9tb25pdG9yYnVuZGxlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3ByZWZpeGVzL3N1Y2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UucGRlLmJ1aWxkL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnL2xvY2F0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2NvbnRleHRzLnZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC5iYXNlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2RlYnVnL3BsdWdpbnN0b3BwZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uvd29ya2JlbmNoLnN0YXJ0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9jb250ZW50dHlwZXMvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc3RyaW5ncyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWcvY2hlY2tDb3JlQmluZGluZ0dldEphdmFFbGVtZW50IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvbWV0YWluZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3RpbWluZy9zdGFydHVwIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcmVzb2x2ZXIvd2lyaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcHJvZmlsZS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcGVyZiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9jb250ZXh0cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9pbnZva2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvdWlqb2IubG9uZ3dhcm5pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJXQVJOSU5HIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy90eXBlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3BlcmYvYnVpbGRlcnMiIHZhbHVlPSIxMDAwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGFnZS5saXN0ZW5lcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvam9iLnN0YWxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1Zy9hbGxUeXBlc0NhY2hlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9oaXN0b3J5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9yZWZyZXNoam9iIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY29tcGxldGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGVyc3BlY3RpdmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaW5kZXhtYW5hZ2VyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvcGFja2FnZWFkbWluIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvbG9hZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL2ZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS90cmVlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9jb25maWcvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWZhdWx0cHJvZmlsZS9sb2dzeW5jaHJvbm91c2x5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2NsYXNzTG9hZGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL21ldGFpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvbWFzdGVydGFibGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3BlcmYvZmFpbHVyZSIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycy52ZXJib3NlLmNvbW1hbmRJZCIgdmFsdWU9IiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvYnVmZmVybWFuYWdlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2ZpbHRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Jlc29sdmVyL2dyb3VwaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1Zy9BU1RQcm92aWRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wYXJ0Lmxpc3RlbmVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3N1Y2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9tYXN0ZXJ0YWJsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby90cmFjZS9sb2dJbmZvIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmlsdGVyL2NsYXNzIiB2YWx1ZT0iKiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMvdGltaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvcHJlZml4ZXMvZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+Ci08L21hcEF0dHJpYnV0ZT4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJzZWxlY3RlZFBsdWdpbiIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS5wcm94eSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuS0VFUFJVTk5JTkdfQVRUUiIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0aW1lc3RhbXAiIHZhbHVlPSIxMTcyMDc5MzQ2OTM2Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24iIHZhbHVlPSJEOlxydW50aW1lLWp1bml0LXRlc3Qtd29ya3NwYWNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYXBwbGljYXRpb24iIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUuanVuaXQucnVudGltZS5jb3JldGVzdGFwcGxpY2F0aW9uIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3cyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLk1BSU5fVFlQRSIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5BbGxTdWl0ZXMiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJsb2NhdGlvbjEiIHZhbHVlPSJEOlxydW50aW1lLWp1bml0LXRlc3Qtd29ya3NwYWNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1vcyB3aW4zMiAtd3Mgd2luMzIgLWFyY2ggeDg2IC1ubCBlbl9VUyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InBkZS52ZXJzaW9uIiB2YWx1ZT0iMy4zIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUTkFNRSIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFza2NsZWFyIiB2YWx1ZT0idHJ1ZSIvPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuamVtLnRlc3RzIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVF9LSU5EIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LmxvYWRlci5qdW5pdDMiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlkOWJhZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamVtLnRlc3RzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuNC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IGphdmF0ZXN0cy5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhVGVzdHNQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IGluaXRQYXJzZXJUZXN0NDYzNzY7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZW0udGVzdHMsCi0gb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJhc2ljLAotIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbywKLSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuaW5zdGFudGlhdGlvbiwKLSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMsCi0gb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LAotIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pZGUsCi0gb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIsCi0gb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZSwKLSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkucmVtb3RlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamVtLnByb3h5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmFudC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4xLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbztidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjcxN2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD48aGVhZD48dGl0bGU+QWJvdXQ8L3RpdGxlPgotCi0KLQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PC9oZWFkPjxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Fib3V0LmluaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzE0ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Fib3V0Lm1hcHBpbmdzIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYWJvdXQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTI5ZWE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUudGVzdHMuZ2l0L3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNi8wNS8xOCAxOTowOTo1NiAkCi0jCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPUphdmEgRU1GIE1vZGVsIFRlc3RzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLiAyMDAwLCAyMDA2LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdmVwCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTAxYjM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBqYXZhdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIHZtL3Rlc3RzLmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3RkYXRhLyxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIucG5nLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotamFycy5jb21waWxlLm9yZGVyID0gdm0vdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGphdmF0ZXN0cy5qYXIKLXNvdXJjZS52bS90ZXN0cy5qYXIgPSB2bV90ZXN0cy8KLXNvdXJjZS5qYXZhdGVzdHMuamFyID0gamF2YXRlc3RzLwotc3JjLmluY2x1ZGVzID0gcHJveHkuamFycwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2VjbGlwc2UzMi5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvSW5pdFBhcnNlclRlc3Q0NjM3Ni5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9Jbml0UGFyc2VyVGVzdDQ2Mzc2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzZhZGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9Jbml0UGFyc2VyVGVzdDQ2Mzc2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJbml0UGFyc2VyVGVzdDQ2Mzc2LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotIAotLyoqCi0gKiBUaGlzIGlzIHRvIHRlc3QgZm9yIGRlZmVjdCBbNDYzNzZdLgotICogCi0gKiBTYW1lTmFtZSB0ZXN0LiBUaGlzIGlzIHRlc3Qgd2hlcmUgeW91IGhhdmUgdGhpczoKLSAqIAlpbml0UGFyc2VyVGVzdDQ2Mzc2LlNhbWVOYW1lVGVzdENsYXNzLmphdmEKLSAqIAlJbml0UGFyc2VyVGVzdDQ2Mzc2LmphdmEKLSAqICAKLSAqIEJlZm9yZSBbNDYzNzZdIHRoZSBTdGF0aWMgcGFyc2VyIHdvdWxkIGZpbmQgdGhyb3cgTm9DbGFzc0RlZkZvdW5kRXJyb3Igb24gaW5pdFBhcnNlclRlc3Q0NjM3NiB3aGVuIGxvb2tpbmcgZm9yCi0gKiBTYW1lTmFtZVRlc3RDbGFzcyBhbmQgbmV2ZXIgZmluZCB0aGUgY2xhc3MuCi0gKiAKLSAqIFRvIGNvbXBpbGUgaW4gRWNsaXBzZSB3ZSBuZWVkIHRvIGhhdmUgb25lIG9mIHRoZSBjbGFzc2VzIGJlIGluIHRoZSBkZWZhdWx0IHBhY2thZ2UuIEVjbGlwc2UgY29tcGxhaW5zIGlmIHdlIGRpZG4ndC4KLSAqIEJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIHN0b3AgdGhpcyBmcm9tIGhhcHBlbmluZyB3aXRoIHBhY2thZ2VzIHRvbyBpZiB0aGV5IGFyZSBzcHJlYWQgYWNyb3NzIGNvbXBpbGUgZ3JvdXBzLiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0UGFyc2VyVGVzdDQ2Mzc2IHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9pbml0UGFyc2VyVGVzdDQ2Mzc2L1NhbWVOYW1lVGVzdENsYXNzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL2luaXRQYXJzZXJUZXN0NDYzNzYvU2FtZU5hbWVUZXN0Q2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExZjdiMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL2luaXRQYXJzZXJUZXN0NDYzNzYvU2FtZU5hbWVUZXN0Q2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgaW5pdFBhcnNlclRlc3Q0NjM3NjsKLS8qCi0gKiAgJFJDU2ZpbGU6IFNhbWVOYW1lVGVzdENsYXNzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTUgJCAKLSAqLwotLyoqCi0gKiBUaGlzIGlzIHRvIHRlc3QgZm9yIGRlZmVjdCBbNDYzNzZdLgotICogCi0gKiBTYW1lTmFtZSB0ZXN0LiBUaGlzIGlzIHRlc3Qgd2hlcmUgeW91IGhhdmUgdGhpczoKLSAqIAlJbml0UGFyc2VyVGVzdDQ2Mzc2LlNhbWVOYW1lVGVzdENsYXNzLmphdmEKLSAqIAlJbml0UGFyc2VyVGVzdDQ2Mzc2LmphdmEKLSAqIAotICogYW5kCi0gKiAKLSAqIAluZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuU2FtZU5hbWVUZXN0Q2xhc3MuUmVhbENsYXNzKCkKLSAqIAotICogQmVmb3JlIFs0NjM3Nl0gdGhlIFN0YXRpYyBwYXJzZXIgd291bGQgZmluZCBTYW1lTmFtZVRlc3RDbGFzcy5qYXZhIGluc3RlYWQgb2YgdGhlIFJlYWxDbGFzcyBhbmQgd291bGQgb2YgZmFpbGVkLgotICogVG8gY29tcGlsZSBpbiBFY2xpcHNlIHdlIG5lZWQgdG8gaGF2ZSBvbmUgb2YgdGhlIGNsYXNzZXMgYmUgaW4gdGhlIGRlZmF1bHQgcGFja2FnZS4gRWNsaXBzZSBjb21wbGFpbnMgaWYgd2UgZGlkbid0LgotICogQnV0IHRoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcCB0aGlzIGZyb20gaGFwcGVuaW5nIHdpdGggcGFja2FnZXMgdG9vIGlmIHRoZXkgYXJlIHNwcmVhZCBhY3Jvc3MgY29tcGlsZSBncm91cHMuICAKLSAqLwotcHVibGljIGNsYXNzIFNhbWVOYW1lVGVzdENsYXNzIHsKLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCS8vIFRvIG1ha2UgdGVzdCBlYXNpZXIsIHdlIHNpbXBseSBsb29raW5nIGlmIGJvdGggb2Ygc2FtZSB0eXBlLgotCQlyZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiBvdGhlci5nZXRDbGFzcygpID09IFNhbWVOYW1lVGVzdENsYXNzLmNsYXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTAxMTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0FsbFN1aXRlcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvQWxsU3VpdGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZWQ5NzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvQWxsU3VpdGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0czsKLS8qCi0gKiAgJFJDU2ZpbGU6IEFsbFN1aXRlcy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNy8wMy8xNCAwMToyMjowNiAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJhc2ljLkJhc2ljU3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLkJlYW5JbmZvU3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5MaXN0ZW5lcnNTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaWRlLklERVByb3h5U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuSW5pdFBhcnNlclN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuQVNUUGFyc2VyU3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LnJlbW90ZS5SZW1vdGVQcm94eVN1aXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFsbFN1aXRlcyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JLy8gVGVzdGEgY2FzZXMgdG8gYmUgaW5jbHVkZSBpbiB0aGUgc3VpdGUKLQlwcml2YXRlIHN0YXRpYyBDbGFzcyBzdWl0ZXNMaXN0W10gPSB7Ci0JCUJhc2ljU3VpdGUuY2xhc3MsCi0JCUpESzVSZWZsZWN0aW9uU3VpdGUuY2xhc3MsCi0JCUluaXRQYXJzZXJTdWl0ZS5jbGFzcywgIAotCQlBU1RQYXJzZXJTdWl0ZS5jbGFzcywKLQkJUmVtb3RlUHJveHlTdWl0ZS5jbGFzcywKLQkJSURFUHJveHlTdWl0ZS5jbGFzcywKLQkJQmVhbkluZm9TdWl0ZS5jbGFzcywKLQkJSW5zdGFudGlhdGlvblN1aXRlLmNsYXNzLAotCQlMaXN0ZW5lcnNTdWl0ZS5jbGFzcywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGtnTmFtZSA9ICJKYXZhIEVNRiBNb2RlbCBqVW5pdCBUZXN0IFN1aXRlIiA7Ci0gICAgCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhY2thZ2VTdWl0ZS4KLQkgKi8KLQlwdWJsaWMgQWxsU3VpdGVzKCkgewotCQlzdXBlcigpOwotCQlwb3B1bGF0ZVN1aXRlKCkgOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWNrYWdlU3VpdGUuCi0JICogQHBhcmFtIHRoZUNsYXNzCi0JICovCi0JcHVibGljIEFsbFN1aXRlcyhDbGFzcyB0aGVDbGFzcykgewotCQlzdXBlcih0aGVDbGFzcyk7Ci0JCXBvcHVsYXRlU3VpdGUoKSA7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhY2thZ2VTdWl0ZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBBbGxTdWl0ZXMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXBvcHVsYXRlU3VpdGUoKSA7Ci0JfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU3VpdGUgKCkgewotICAgIAlmb3IgKGludCBpPTA7IGk8c3VpdGVzTGlzdC5sZW5ndGg7IGkrKykKLSAgICAJICB0cnkgewotCQkJVGVzdCB0cyA9IChUZXN0KSBzdWl0ZXNMaXN0W2ldLm5ld0luc3RhbmNlKCkgOwotCQkJYWRkVGVzdCh0cykgOwotCQkgIH0KLQkJICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CQkgCi0gICAgfQotICAgIAotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBBbGxTdWl0ZXMocGtnTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KREs1QmluUmVmbGVjdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KREs1QmluUmVmbGVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZGNmNDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSkRLNUJpblJlZmxlY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0czsKLQotCi0vKioKLSAqIFRlc3QgY2FzZSBmb3IgdGVzdGluZyB0aGUgcmVmbGVjdGlvbiBvZiBjb25jZXB0cwotICogZnJvbSBKREsgNSB3aGVuIHNvdXJjZSBpcyBub3QgYXZhaWxhYmxlLgotICogQHNpbmNlIDEuMi4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSkRLNUJpblJlZmxlY3Rpb25UZXN0cyBleHRlbmRzIEpESzVSZWZsZWN0aW9uVGVzdHMgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEpESzVCaW5SZWZsZWN0aW9uVGVzdHMoKSB7Ci0JCWlzUmVmbGVjdGluZ1NvdXJjZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEpESzVCaW5SZWZsZWN0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCWlzUmVmbGVjdGluZ1NvdXJjZSA9IGZhbHNlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0pESzVSZWZsZWN0aW9uU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0pESzVSZWZsZWN0aW9uU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3Nzk2Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KREs1UmVmbGVjdGlvblN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEpESzVSZWZsZWN0aW9uU3VpdGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNi8xMC8yNyAxOTozNjozMyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGhpcyBpcyBiYXNpYyBKRU0gSkRLNSB0b2xlcmF0aW9uIG1vZGUgdGVzdHMuCi0gKiAKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKREs1UmVmbGVjdGlvblN1aXRlIGV4dGVuZHMgVGVzdFNldHVwIHsKLQotCS8vIFRlc3QgY2FzZXMgdG8gYmUgaW5jbHVkZSBpbiB0aGUgc3VpdGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyB0ZXN0c0xpc3RbXSA9IHsgSkRLNVJlZmxlY3Rpb25UZXN0cy5jbGFzcywgSkRLNUJpblJlZmxlY3Rpb25UZXN0cy5jbGFzc307Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSkRLNVJlZmxlY3Rpb25TdWl0ZSgpIHsKLQkJdGhpcygiVGVzdCBCYXNpYyBKRU0gSkRLNSB0b2xlcmF0aW9uIG1vZGUgU3VpdGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBKREs1UmVmbGVjdGlvblN1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5ldyBUZXN0U3VpdGUobmFtZSkgewotCQkJewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHNMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pOwotCQkJCX0KLQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgSkRLNVJlZmxlY3Rpb25TdWl0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0pESzVSZWZsZWN0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0pESzVSZWZsZWN0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhZTg1OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KREs1UmVmbGVjdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YUpET01BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0vKioKLSAqIFRlc3QgY2FzZSBmb3IgdGVzdGluZyB0aGUgcmVmbGVjdGlvbiBvZiBjb25jZXB0cwotICogZnJvbSBKREsgNS4KLSAqIEBzaW5jZSAxLjIuMgotICoKLSAqLwotcHVibGljIGNsYXNzIEpESzVSZWZsZWN0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJKREs1VGVzdHMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gb2xkQXV0b0J1aWxkaW5nU3RhdGU7IC8vIGF1dG9CdWlsZGluZyBzdGF0ZSBiZWZvcmUgd2Ugc3RhcnRlZC4KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUmVmbGVjdGluZ1NvdXJjZTsKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSkRLNVJlZmxlY3Rpb25UZXN0cygpIHsKLQkJaXNSZWZsZWN0aW5nU291cmNlID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBKREs1UmVmbGVjdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQlpc1JlZmxlY3RpbmdTb3VyY2UgPSB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlpZiAoaXNSZWZsZWN0aW5nU291cmNlKQotCQkJc2V0VXBGb3JTb3VyY2UoKTsKLQkJZWxzZQotCQkJc2V0VXBGb3JOb1NvdXJjZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwRm9yU291cmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlvbGRBdXRvQnVpbGRpbmdTdGF0ZSA9IEphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQodHJ1ZSk7Ci0JCVVSTCBpbnN0YWxsVVJMID0gSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0JCVN0cmluZ1tdIHppcFBhdGhzID0gbmV3IFN0cmluZ1sxXTsKLQkJemlwUGF0aHNbMF0gPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTChpbnN0YWxsVVJMLCAidGVzdGRhdGEvSkRLNVRlc3RzLnppcCIpKS5nZXRGaWxlKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPQotCQkJSmF2YVByb2plY3RVdGlsLmltcG9ydFByb2plY3RzKAotCQkJCW5ldyBTdHJpbmdbXSB7IFBST0pFQ1RfTkFNRSB9LAotCQkJCXppcFBhdGhzKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0c1swXSk7Ci0JCUphdmFQcm9qZWN0VXRpbC53YWl0Rm9yQXV0b0J1aWxkKCk7Ci0JCWphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3RzWzBdKTsKLQkJamF2YVByb2plY3Quc2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsICIxLjUiKTsKLQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCXJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IEphdmFKRE9NQWRhcHRlckZhY3RvcnkoamF2YVByb2plY3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcEZvck5vU291cmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlvbGRBdXRvQnVpbGRpbmdTdGF0ZSA9IEphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQodHJ1ZSk7Ci0JCVVSTCBpbnN0YWxsVVJMID0gSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0JCVN0cmluZ1tdIGphclBhdGhzID0gbmV3IFN0cmluZ1sxXTsKLQkJamFyUGF0aHNbMF0gPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTChpbnN0YWxsVVJMLCAidGVzdGRhdGEvSkRLNUJpblRlc3RzLmphciIpKS5nZXRGaWxlKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBKYXZhUHJvamVjdFV0aWwuY3JlYXRlRW1wdHlKYXZhUHJvamVjdChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCksIG5ldyBQYXRoKFBST0pFQ1RfTkFNRSksIG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHByb2plY3QpOwotCQlKYXZhUHJvamVjdFV0aWwud2FpdEZvckF1dG9CdWlsZCgpOwotCQlqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJamF2YVByb2plY3Quc2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsICIxLjUiKTsKLQkJQXJyYXlMaXN0IGNsYXNzcGF0aCA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSkpOwotCQljbGFzc3BhdGguYWRkKEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChqYXJQYXRoc1swXSksIG51bGwsIG51bGwpKTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKChJQ2xhc3NwYXRoRW50cnlbXSkgY2xhc3NwYXRoLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVswXSksIG51bGwpOwkKLQkJSmF2YVByb2plY3RVdGlsLndhaXRGb3JBdXRvQnVpbGQoKTsKLQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCXJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IEphdmFKRE9NQWRhcHRlckZhY3RvcnkoamF2YVByb2plY3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCUphdmFQcm9qZWN0VXRpbC5kZWxldGVQcm9qZWN0KGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCQl9Ci0JCX0sIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIDAsIG51bGwpOwotCi0JCUphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQob2xkQXV0b0J1aWxkaW5nU3RhdGUpOwotCX0KLQkKLQlwcml2YXRlIEphdmFIZWxwZXJzIHJlZmxlY3RDbGFzcyhTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKHF1YWxpZmllZE5hbWUsIHJlc291cmNlU2V0KTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBtZXRob2QgdGVzdDEgZnJvbSBUZXN0IGNsYXNzLgotCSAqIAotCSAqIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gdGVzdDEoKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gCQlKYXZhSGVscGVycyB0ZXN0SGVscGVyID0gcmVmbGVjdENsYXNzKCJ0ZXN0Lm1lLlRlc3QiKTsKLQkJYXNzZXJ0RmFsc2UodGVzdEhlbHBlci5pc1ByaW1pdGl2ZSgpKTsKLQkJSmF2YUNsYXNzIHRlc3RDbGFzcyA9IChKYXZhQ2xhc3MpIHRlc3RIZWxwZXI7Ci0JCWFzc2VydFRydWUoKHRlc3RDbGFzcykuaXNFeGlzdGluZ1R5cGUoKSk7Ci0JCQotCQlNZXRob2QgbWV0aG9kID0gdGVzdENsYXNzLmdldE1ldGhvZCgidGVzdDEiLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQlKYXZhSGVscGVycyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5Db2xsZWN0aW9uIiwgcmV0dXJuVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNvbGxlY3Rpb24iLCByZXR1cm5UeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIHRlc3QyIGZyb20gVGVzdCBjbGFzcy4KLQkgKiAKLQkgKiBwdWJsaWMgdm9pZCB0ZXN0MihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJRm9vPiBhQ29sbGVjdGlvbikgCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MigpIHsKLQkJSmF2YUhlbHBlcnMgdGVzdEhlbHBlciA9IHJlZmxlY3RDbGFzcygidGVzdC5tZS5UZXN0Iik7Ci0JCUphdmFDbGFzcyB0ZXN0Q2xhc3MgPSAoSmF2YUNsYXNzKSB0ZXN0SGVscGVyOwotCQlhc3NlcnRUcnVlKCh0ZXN0Q2xhc3MpLmlzRXhpc3RpbmdUeXBlKCkpOwotCQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUxpc3QgbWV0aG9kcyA9IHRlc3RDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kcy5nZXQoaSk7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoInRlc3QyIikpIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJbWV0aG9kID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQlKYXZhSGVscGVycyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXR1cm5UeXBlKTsgLy92b2lkCi0JCUxpc3QgcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJhbXMuc2l6ZSgpID09IDEpOwotCQlKYXZhUGFyYW1ldGVyIHBhcmFtID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoMCk7Ci0JCWlmIChpc1JlZmxlY3RpbmdTb3VyY2UpCi0JCQlhc3NlcnRUcnVlKHBhcmFtLmdldE5hbWUoKS5lcXVhbHMoImFDb2xsZWN0aW9uIikpOwotCQlKYXZhSGVscGVycyBwYXJhbVR5cGUgPSBwYXJhbS5nZXRKYXZhVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmFtVHlwZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5Db2xsZWN0aW9uIiwgcGFyYW1UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ29sbGVjdGlvbiIsIHBhcmFtVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIHRlc3QzIGZyb20gVGVzdCBjbGFzcy4KLQkgKiAKLQkgKiBwdWJsaWMgPFQgZXh0ZW5kcyBJRm9vPiBUIHRlc3QzKENsYXNzPFQ+IGFDbGFzcywgU3RyaW5nIHMsIExpc3Q8SW50ZWdlcj4gYUxpc3QpIAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0JCUphdmFIZWxwZXJzIHRlc3RIZWxwZXIgPSByZWZsZWN0Q2xhc3MoInRlc3QubWUuVGVzdCIpOwotCQlKYXZhQ2xhc3MgdGVzdENsYXNzID0gKEphdmFDbGFzcykgdGVzdEhlbHBlcjsKLQkJYXNzZXJ0VHJ1ZSgodGVzdENsYXNzKS5pc0V4aXN0aW5nVHlwZSgpKTsKLQkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlMaXN0IG1ldGhvZHMgPSB0ZXN0Q2xhc3MuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJ0ZXN0MyIpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCW1ldGhvZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJCi0JCS8vVmVyaWZ5IHJldHVybiB0eXBlLgkJCi0JCUphdmFIZWxwZXJzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHJldHVyblR5cGUpOyAKLQkJCi0JCWFzc2VydEVxdWFscygidGVzdC5kZXBlbmRlbnRzLklGb28iLCByZXR1cm5UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSUZvbyIsIHJldHVyblR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJCi0JCS8vVmVyaWZ5IHBhcmFtZXRlcnMKLQkJTGlzdCBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQlhc3NlcnRUcnVlKHBhcmFtcy5zaXplKCkgPT0gMyk7Ci0JCQotCQkvL1ZlcmlmeSBDbGFzczxUPiBhQ2xhc3MKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTEgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgwKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydFRydWUocGFyYW0xLmdldE5hbWUoKS5lcXVhbHMoImFDbGFzcyIpKTsKLQkJSmF2YUhlbHBlcnMgcGFyYW0xVHlwZSA9IHBhcmFtMS5nZXRKYXZhVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmFtMVR5cGUpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzIiwgcGFyYW0xVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNsYXNzIiwgcGFyYW0xVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCQkKLQkJLy9WZXJpZnkgU3RyaW5nIHMKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTIgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgxKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydEVxdWFscygicyIsIHBhcmFtMi5nZXROYW1lKCkpOwotCQlKYXZhSGVscGVycyBwYXJhbTJUeXBlID0gcGFyYW0yLmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW0yVHlwZSk7Ci0KLQkJLy9WZXJpZnkgTGlzdDxJbnRlZ2VyPiBhTGlzdAotCQlKYXZhSGVscGVycyBsaXN0VHlwZSA9IHJlZmxlY3RDbGFzcygiamF2YS51dGlsLkxpc3QiKTsKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTMgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgyKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydEVxdWFscygiYUxpc3QiLCBwYXJhbTMuZ2V0TmFtZSgpKTsKLQkJSmF2YUhlbHBlcnMgcGFyYW0zVHlwZSA9IHBhcmFtMy5nZXRKYXZhVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmFtM1R5cGUpOwotCQlhc3NlcnRFcXVhbHMobGlzdFR5cGUsIHBhcmFtM1R5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IG1ldGhvZCB0ZXN0NCBmcm9tIFRlc3QgY2xhc3MuCi0JICogCi0JICogcHVibGljIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHRlc3Q0KEludGVnZXIgYW5JbnRlZ2VyKSAKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Q0KCkgewotCQlKYXZhSGVscGVycyB0ZXN0SGVscGVyID0gcmVmbGVjdENsYXNzKCJ0ZXN0Lm1lLlRlc3QiKTsKLQkJSmF2YUNsYXNzIHRlc3RDbGFzcyA9IChKYXZhQ2xhc3MpIHRlc3RIZWxwZXI7Ci0JCWFzc2VydFRydWUoKHRlc3RDbGFzcykuaXNFeGlzdGluZ1R5cGUoKSk7Ci0JCQotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gdGVzdENsYXNzLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBtZXRob2RzLmdldChpKTsKLQkJCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygidGVzdDQiKSkgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQltZXRob2QgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0JCQotCQkvL1ZlcmlmeSByZXR1cm4gdHlwZS4JCQotCQlKYXZhSGVscGVycyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXR1cm5UeXBlKTsgCi0JCQotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAiLCByZXR1cm5UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTWFwIiwgcmV0dXJuVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IG1ldGhvZCB0ZXN0NSBmcm9tIFRlc3QgY2xhc3MuCi0JICogCi0JICogcHVibGljIHZvaWQgdGVzdDUoTGlzdDw/IHN1cGVyIElGb28+IGFMaXN0KQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDUoKSB7Ci0JCUphdmFIZWxwZXJzIHRlc3RIZWxwZXIgPSByZWZsZWN0Q2xhc3MoInRlc3QubWUuVGVzdCIpOwotCQlKYXZhQ2xhc3MgdGVzdENsYXNzID0gKEphdmFDbGFzcykgdGVzdEhlbHBlcjsKLQkJYXNzZXJ0VHJ1ZSgodGVzdENsYXNzKS5pc0V4aXN0aW5nVHlwZSgpKTsKLQkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlMaXN0IG1ldGhvZHMgPSB0ZXN0Q2xhc3MuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJ0ZXN0NSIpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCW1ldGhvZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJCi0JCS8vVmVyaWZ5IHBhcmFtZXRlcnMKLQkJTGlzdCBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQlhc3NlcnRUcnVlKHBhcmFtcy5zaXplKCkgPT0gMSk7Ci0JCQotCQlKYXZhUGFyYW1ldGVyIHBhcmFtMSA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KDApOwotCQlpZiAoaXNSZWZsZWN0aW5nU291cmNlKQotCQkJYXNzZXJ0VHJ1ZShwYXJhbTEuZ2V0TmFtZSgpLmVxdWFscygiYUxpc3QiKSk7Ci0JCUphdmFIZWxwZXJzIHBhcmFtMVR5cGUgPSBwYXJhbTEuZ2V0SmF2YVR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJhbTFUeXBlKTsKLQkJCi0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3QiLCBwYXJhbTFUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTGlzdCIsIHBhcmFtMVR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IG1ldGhvZCB0ZXN0NiBmcm9tIFRlc3QgY2xhc3MuCi0JICogCi0JICogcHVibGljIDxUPiB2b2lkIHRlc3Q2KENsYXNzPFQ+W10gYUNsYXNzQXJyYXksIExpc3Q8U3RyaW5nPltdIGFuQXJyYXlPZkxpc3RzT2ZTdHJpbmcsIENsYXNzPD8+W10gYVdpbGRjYXJkQ2xhc3NBcnJheSwgQ2xhc3M8Pz5bXVtdW10gYU11bHRpRGltV2lsZGNhcmRBcnJheSkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Q2KCkgewotCQlKYXZhSGVscGVycyB0ZXN0SGVscGVyID0gcmVmbGVjdENsYXNzKCJ0ZXN0Lm1lLlRlc3QiKTsKLQkJSmF2YUNsYXNzIHRlc3RDbGFzcyA9IChKYXZhQ2xhc3MpIHRlc3RIZWxwZXI7Ci0JCWFzc2VydFRydWUoKHRlc3RDbGFzcykuaXNFeGlzdGluZ1R5cGUoKSk7Ci0JCQotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gdGVzdENsYXNzLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBtZXRob2RzLmdldChpKTsKLQkJCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygidGVzdDYiKSkgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQltZXRob2QgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0JCQotCQkvL1ZlcmlmeSBwYXJhbWV0ZXJzCi0JCUxpc3QgcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHBhcmFtcy5zaXplKCkpOwotCQkKLQkJLy8gVmVyaWZ5IENsYXNzPFQ+W10gYUNsYXNzQXJyYXkKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTEgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgwKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydFRydWUocGFyYW0xLmdldE5hbWUoKS5lcXVhbHMoImFDbGFzc0FycmF5IikpOwotCQlKYXZhSGVscGVycyBwYXJhbTFUeXBlID0gcGFyYW0xLmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW0xVHlwZSk7Ci0JCWFzc2VydFRydWUoKChBcnJheVR5cGUpcGFyYW0xVHlwZSkuZ2V0QXJyYXlEaW1lbnNpb25zKCkgPT0gMSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzW10iLCBwYXJhbTFUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ2xhc3NbXSIsIHBhcmFtMVR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuQ2xhc3MiLCAoKEFycmF5VHlwZSlwYXJhbTFUeXBlKS5nZXRDb21wb25lbnRUeXBlQXNIZWxwZXIoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNsYXNzIiwgKChBcnJheVR5cGUpcGFyYW0xVHlwZSkuZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQotCQkvLyBWZXJpZnkgTGlzdDxTdHJpbmc+W10gYW5BcnJheU9mTGlzdHNPZlN0cmluZwotCQlKYXZhUGFyYW1ldGVyIHBhcmFtMiA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KDEpOwotCQlpZiAoaXNSZWZsZWN0aW5nU291cmNlKQotCQkJYXNzZXJ0VHJ1ZShwYXJhbTIuZ2V0TmFtZSgpLmVxdWFscygiYW5BcnJheU9mTGlzdHNPZlN0cmluZyIpKTsKLQkJSmF2YUhlbHBlcnMgcGFyYW0yVHlwZSA9IHBhcmFtMi5nZXRKYXZhVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmFtMlR5cGUpOwotCQlhc3NlcnRUcnVlKCgoQXJyYXlUeXBlKXBhcmFtMlR5cGUpLmdldEFycmF5RGltZW5zaW9ucygpID09IDEpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0W10iLCBwYXJhbTJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTGlzdFtdIiwgcGFyYW0yVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0IiwgKChBcnJheVR5cGUpcGFyYW0yVHlwZSkuZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMaXN0IiwgKChBcnJheVR5cGUpcGFyYW0yVHlwZSkuZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJCi0JCS8vIFZlcmlmeSBDbGFzczw/PltdIGFXaWxkY2FyZENsYXNzQXJyYXkKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTMgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgyKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydFRydWUocGFyYW0zLmdldE5hbWUoKS5lcXVhbHMoImFXaWxkY2FyZENsYXNzQXJyYXkiKSk7Ci0JCUphdmFIZWxwZXJzIHBhcmFtM1R5cGUgPSBwYXJhbTMuZ2V0SmF2YVR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJhbTNUeXBlKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFycmF5VHlwZSlwYXJhbTNUeXBlKS5nZXRBcnJheURpbWVuc2lvbnMoKSA9PSAxKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuQ2xhc3NbXSIsIHBhcmFtM1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDbGFzc1tdIiwgcGFyYW0zVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5DbGFzcyIsICgoQXJyYXlUeXBlKXBhcmFtM1R5cGUpLmdldENvbXBvbmVudFR5cGVBc0hlbHBlcigpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ2xhc3MiLCAoKEFycmF5VHlwZSlwYXJhbTNUeXBlKS5nZXRDb21wb25lbnRUeXBlQXNIZWxwZXIoKS5nZXRTaW1wbGVOYW1lKCkpOwotCi0JCS8vIFZlcmlmeSBDbGFzczw/PltdW11bXSBhTXVsdGlEaW1XaWxkY2FyZEFycmF5Ci0JCUphdmFQYXJhbWV0ZXIgcGFyYW00ID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoMyk7Ci0JCWlmIChpc1JlZmxlY3RpbmdTb3VyY2UpCi0JCQlhc3NlcnRUcnVlKHBhcmFtNC5nZXROYW1lKCkuZXF1YWxzKCJhTXVsdGlEaW1XaWxkY2FyZEFycmF5IikpOwotCQlKYXZhSGVscGVycyBwYXJhbTRUeXBlID0gcGFyYW00LmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW00VHlwZSk7Ci0JCWFzc2VydFRydWUoKChBcnJheVR5cGUpcGFyYW00VHlwZSkuZ2V0QXJyYXlEaW1lbnNpb25zKCkgPT0gMyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzW11bXVtdIiwgcGFyYW00VHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNsYXNzW11bXVtdIiwgcGFyYW00VHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCQlKYXZhSGVscGVycyBjb21wb25lbnRUeXBlID0gKChBcnJheVR5cGUpcGFyYW00VHlwZSkuZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyKCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzW11bXSIsIGNvbXBvbmVudFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDbGFzc1tdW10iLCBjb21wb25lbnRUeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JCWNvbXBvbmVudFR5cGUgPSAoKEFycmF5VHlwZSkgY29tcG9uZW50VHlwZSkuZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyKCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzW10iLCBjb21wb25lbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ2xhc3NbXSIsIGNvbXBvbmVudFR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJY29tcG9uZW50VHlwZSA9ICgoQXJyYXlUeXBlKSBjb21wb25lbnRUeXBlKS5nZXRDb21wb25lbnRUeXBlQXNIZWxwZXIoKTsKLQkJCi0JfQkKLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIHRlc3Q3IGZyb20gVGVzdCBjbGFzcy4KLQkgKiAKLQkgKiBwdWJsaWMgPFQ+IHZvaWQgdGVzdDcoTGlzdDxMaXN0PFN0cmluZz4+IGFMaXN0T2ZMaXN0T2ZTdHJpbmcsIExpc3Q8TGlzdDxUPj4gYUxpc3RPZkxpc3RPZlQsIE1hcDxJRm9vLCBMaXN0PE1hcDxJQmFyLCBUPj4+IGFNYXApCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0NygpIHsKLQkJSmF2YUhlbHBlcnMgdGVzdEhlbHBlciA9IHJlZmxlY3RDbGFzcygidGVzdC5tZS5UZXN0Iik7Ci0JCUphdmFDbGFzcyB0ZXN0Q2xhc3MgPSAoSmF2YUNsYXNzKSB0ZXN0SGVscGVyOwotCQlhc3NlcnRUcnVlKCh0ZXN0Q2xhc3MpLmlzRXhpc3RpbmdUeXBlKCkpOwotCQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUxpc3QgbWV0aG9kcyA9IHRlc3RDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kcy5nZXQoaSk7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoInRlc3Q3IikpIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJbWV0aG9kID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQkKLQkJLy9WZXJpZnkgcGFyYW1ldGVycwotCQlMaXN0IHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCWFzc2VydFRydWUocGFyYW1zLnNpemUoKSA9PSAzKTsKLQotCQkKLQkJLy8gVmVyaWZ5IExpc3Q8TGlzdDxTdHJpbmc+PiBhTGlzdE9mTGlzdE9mU3RyaW5nCi0JCUphdmFQYXJhbWV0ZXIgcGFyYW0xID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoMCk7Ci0JCWlmIChpc1JlZmxlY3RpbmdTb3VyY2UpCi0JCQlhc3NlcnRUcnVlKHBhcmFtMS5nZXROYW1lKCkuZXF1YWxzKCJhTGlzdE9mTGlzdE9mU3RyaW5nIikpOwotCQlKYXZhSGVscGVycyBwYXJhbTFUeXBlID0gcGFyYW0xLmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW0xVHlwZSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3QiLCBwYXJhbTFUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTGlzdCIsIHBhcmFtMVR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQotCQkvLyBWZXJpZnkgTGlzdDxMaXN0PFQ+PiBhTGlzdE9mTGlzdE9mVAotCQlKYXZhUGFyYW1ldGVyIHBhcmFtMiA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KDEpOwotCQlpZiAoaXNSZWZsZWN0aW5nU291cmNlKQotCQkJYXNzZXJ0VHJ1ZShwYXJhbTIuZ2V0TmFtZSgpLmVxdWFscygiYUxpc3RPZkxpc3RPZlQiKSk7Ci0JCUphdmFIZWxwZXJzIHBhcmFtMlR5cGUgPSBwYXJhbTIuZ2V0SmF2YVR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJhbTJUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIsIHBhcmFtMlR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMaXN0IiwgcGFyYW0yVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCi0JCS8vIFZlcmlmeSBNYXA8SUZvbywgTGlzdDxNYXA8SUJhciwgVD4+PiBhTWFwCi0JCUphdmFQYXJhbWV0ZXIgcGFyYW0zID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoMik7Ci0JCWlmIChpc1JlZmxlY3RpbmdTb3VyY2UpCi0JCQlhc3NlcnRUcnVlKHBhcmFtMy5nZXROYW1lKCkuZXF1YWxzKCJhTWFwIikpOwotCQlKYXZhSGVscGVycyBwYXJhbTNUeXBlID0gcGFyYW0zLmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW0zVHlwZSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCIsIHBhcmFtM1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNYXAiLCBwYXJhbTNUeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IG1ldGhvZCB0ZXN0OCBmcm9tIFRlc3QgY2xhc3MuCi0JICogCi0JICogcHVibGljIHZvaWQgdGVzdDgoTGlzdDw/IGV4dGVuZHMgTGlzdDxTdHJpbmc+PiBhTGlzdCkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Q4KCkgewotCQlKYXZhSGVscGVycyB0ZXN0SGVscGVyID0gcmVmbGVjdENsYXNzKCJ0ZXN0Lm1lLlRlc3QiKTsKLQkJSmF2YUNsYXNzIHRlc3RDbGFzcyA9IChKYXZhQ2xhc3MpIHRlc3RIZWxwZXI7Ci0JCWFzc2VydFRydWUoKHRlc3RDbGFzcykuaXNFeGlzdGluZ1R5cGUoKSk7Ci0JCQotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gdGVzdENsYXNzLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBtZXRob2RzLmdldChpKTsKLQkJCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygidGVzdDgiKSkgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQltZXRob2QgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0JCQotCQkvL1ZlcmlmeSBwYXJhbWV0ZXJzCi0JCUxpc3QgcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJhbXMuc2l6ZSgpID09IDEpOwotCQkKLQkJLy8gVmVyaWZ5IExpc3Q8PyBleHRlbmRzIExpc3Q8U3RyaW5nPj4gYUxpc3QKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTEgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgwKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydFRydWUocGFyYW0xLmdldE5hbWUoKS5lcXVhbHMoImFMaXN0IikpOwotCQlKYXZhSGVscGVycyBwYXJhbTFUeXBlID0gcGFyYW0xLmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW0xVHlwZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0IiwgcGFyYW0xVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxpc3QiLCBwYXJhbTFUeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IG1ldGhvZCB0ZXN0OSBmcm9tIFRlc3QgY2xhc3MuCi0JICogVGhpcyBpcyB0aGUgc2FtZSB0ZXN0IGFzIHRlc3Q3IGJ1dCB3aXRoIHF1YWxpZmllZCBuYW1lcy4KLQkgKiAKLQkgKiBwdWJsaWMgPFQ+IHZvaWQgdGVzdDkoamF2YS51dGlsLkxpc3Q8amF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4+IGFMaXN0T2ZMaXN0T2ZTdHJpbmcsIGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PFQ+PiBhTGlzdE9mTGlzdE9mVCwgamF2YS51dGlsLk1hcDx0ZXN0LmRlcGVuZGVudHMuSUZvbywgamF2YS51dGlsLkxpc3Q8amF2YS51dGlsLk1hcDx0ZXN0LmRlcGVuZGVudHMuSUJhciwgVD4+PiBhTWFwKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDkoKSB7Ci0JCUphdmFIZWxwZXJzIHRlc3RIZWxwZXIgPSByZWZsZWN0Q2xhc3MoInRlc3QubWUuVGVzdCIpOwotCQlKYXZhQ2xhc3MgdGVzdENsYXNzID0gKEphdmFDbGFzcykgdGVzdEhlbHBlcjsKLQkJYXNzZXJ0VHJ1ZSgodGVzdENsYXNzKS5pc0V4aXN0aW5nVHlwZSgpKTsKLQkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlMaXN0IG1ldGhvZHMgPSB0ZXN0Q2xhc3MuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJ0ZXN0OSIpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCW1ldGhvZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJCi0JCS8vVmVyaWZ5IHBhcmFtZXRlcnMKLQkJTGlzdCBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQlhc3NlcnRUcnVlKHBhcmFtcy5zaXplKCkgPT0gMyk7Ci0JCi0JCQotCQkvLyBWZXJpZnkgTGlzdDxMaXN0PFN0cmluZz4+IGFMaXN0T2ZMaXN0T2ZTdHJpbmcKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTEgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgwKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydFRydWUocGFyYW0xLmdldE5hbWUoKS5lcXVhbHMoImFMaXN0T2ZMaXN0T2ZTdHJpbmciKSk7Ci0JCUphdmFIZWxwZXJzIHBhcmFtMVR5cGUgPSBwYXJhbTEuZ2V0SmF2YVR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJhbTFUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIsIHBhcmFtMVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMaXN0IiwgcGFyYW0xVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCQotCQkvLyBWZXJpZnkgTGlzdDxMaXN0PFQ+PiBhTGlzdE9mTGlzdE9mVAotCQlKYXZhUGFyYW1ldGVyIHBhcmFtMiA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KDEpOwotCQlpZiAoaXNSZWZsZWN0aW5nU291cmNlKQotCQkJYXNzZXJ0VHJ1ZShwYXJhbTIuZ2V0TmFtZSgpLmVxdWFscygiYUxpc3RPZkxpc3RPZlQiKSk7Ci0JCUphdmFIZWxwZXJzIHBhcmFtMlR5cGUgPSBwYXJhbTIuZ2V0SmF2YVR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJhbTJUeXBlKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0IiwgcGFyYW0yVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxpc3QiLCBwYXJhbTJUeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JCi0JCS8vIFZlcmlmeSBNYXA8SUZvbywgTGlzdDxNYXA8SUJhciwgVD4+PiBhTWFwCi0JCUphdmFQYXJhbWV0ZXIgcGFyYW0zID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoMik7Ci0JCWlmIChpc1JlZmxlY3RpbmdTb3VyY2UpCi0JCQlhc3NlcnRUcnVlKHBhcmFtMy5nZXROYW1lKCkuZXF1YWxzKCJhTWFwIikpOwotCQlKYXZhSGVscGVycyBwYXJhbTNUeXBlID0gcGFyYW0zLmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW0zVHlwZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAiLCBwYXJhbTNUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTWFwIiwgcGFyYW0zVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IG1ldGhvZCB0ZXN0MTAgZnJvbSBUZXN0IGNsYXNzLgotCSAqIAotCSAqIHB1YmxpYyA8VCBleHRlbmRzIFRlc3Rlcj4gVCB0ZXN0MTAoTGlzdDxJbnRlZ2VyPiBsaXN0KQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDEwKCkgewotCQlKYXZhSGVscGVycyB0ZXN0SGVscGVyID0gcmVmbGVjdENsYXNzKCJ0ZXN0Lm1lLlRlc3QiKTsKLQkJSmF2YUNsYXNzIHRlc3RDbGFzcyA9IChKYXZhQ2xhc3MpIHRlc3RIZWxwZXI7Ci0JCWFzc2VydFRydWUoKHRlc3RDbGFzcykuaXNFeGlzdGluZ1R5cGUoKSk7Ci0JCQotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gdGVzdENsYXNzLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBtZXRob2RzLmdldChpKTsKLQkJCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygidGVzdDEwIikpIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJbWV0aG9kID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQkKLQkJSmF2YUhlbHBlcnMgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInRlc3QuZGVwZW5kZW50cy5UZXN0ZXIiLCByZXR1cm5UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdGVyIiwgcmV0dXJuVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCQkKLQkJLy9WZXJpZnkgcGFyYW1ldGVycwotCQlMaXN0IHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCWFzc2VydFRydWUocGFyYW1zLnNpemUoKSA9PSAxKTsKLQkKLQkJCi0JCS8vIFZlcmlmeSBMaXN0PExpc3Q8U3RyaW5nPj4gYUxpc3RPZkxpc3RPZlN0cmluZwotCQlKYXZhUGFyYW1ldGVyIHBhcmFtMSA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KDApOwotCQlpZiAoaXNSZWZsZWN0aW5nU291cmNlKQotCQkJYXNzZXJ0VHJ1ZShwYXJhbTEuZ2V0TmFtZSgpLmVxdWFscygibGlzdCIpKTsKLQkJSmF2YUhlbHBlcnMgcGFyYW0xVHlwZSA9IHBhcmFtMS5nZXRKYXZhVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmFtMVR5cGUpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0IiwgcGFyYW0xVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxpc3QiLCBwYXJhbTFUeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIHRlc3QxMSBmcm9tIFRlc3QgY2xhc3MuCi0JICogCi0JICogcHVibGljIDxUIGV4dGVuZHMgVGVzdGVyPiBUW10gdGVzdDExKCkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QxMSgpIHsKLQkJSmF2YUhlbHBlcnMgdGVzdEhlbHBlciA9IHJlZmxlY3RDbGFzcygidGVzdC5tZS5UZXN0Iik7Ci0JCUphdmFDbGFzcyB0ZXN0Q2xhc3MgPSAoSmF2YUNsYXNzKSB0ZXN0SGVscGVyOwotCQlhc3NlcnRUcnVlKCh0ZXN0Q2xhc3MpLmlzRXhpc3RpbmdUeXBlKCkpOwotCQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUxpc3QgbWV0aG9kcyA9IHRlc3RDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kcy5nZXQoaSk7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoInRlc3QxMSIpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCW1ldGhvZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJLy9UT0RPIG5lZWQgdG8gcmV2aXNpdAotLy8JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLS8vCQkKLS8vCQlKYXZhSGVscGVycyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoInRlc3QuZGVwZW5kZW50cy5UZXN0ZXJbXSIsIHJldHVyblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIlRlc3RlcltdIiwgcmV0dXJuVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIHRlc3QxMSBmcm9tIFRlc3QgY2xhc3MuCi0JICogCi0JICogcHVibGljIDxUIGV4dGVuZHMgVGVzdGVyPiBUW11bXVtdIHRlc3QxMSgpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MTIoKSB7Ci0JCUphdmFIZWxwZXJzIHRlc3RIZWxwZXIgPSByZWZsZWN0Q2xhc3MoInRlc3QubWUuVGVzdCIpOwotCQlKYXZhQ2xhc3MgdGVzdENsYXNzID0gKEphdmFDbGFzcykgdGVzdEhlbHBlcjsKLQkJYXNzZXJ0VHJ1ZSgodGVzdENsYXNzKS5pc0V4aXN0aW5nVHlwZSgpKTsKLQkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlMaXN0IG1ldGhvZHMgPSB0ZXN0Q2xhc3MuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJ0ZXN0MTIiKSkgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQltZXRob2QgPSBudWxsOwotCQkJfQotCQl9Ci0JCS8vVE9ETyBuZWVkIHRvIHJldmlzaXQKLS8vCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0vLwkJCi0vLwkJSmF2YUhlbHBlcnMgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LmRlcGVuZGVudHMuVGVzdGVyW11bXVtdIiwgcmV0dXJuVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiVGVzdGVyW11bXVtdIiwgcmV0dXJuVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCX0KLQkvKioKLQkgKiBUZXN0IG1ldGhvZCB0ZXN0MTMgZnJvbSBUZXN0IGNsYXNzLgotCSAqIAotCSAqIHB1YmxpYyB2b2lkIHRlc3QxMyhZIHBhcmFtKSAod2hlcmUgWSBpcyBhIGNsYXNzLWxldmVsIHR5cGUgcGFyYW1ldGVyCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MTMoKSB7Ci0JCUphdmFIZWxwZXJzIHRlc3RIZWxwZXIgPSByZWZsZWN0Q2xhc3MoInRlc3QubWUuVGVzdCIpOwotCQlKYXZhQ2xhc3MgdGVzdENsYXNzID0gKEphdmFDbGFzcykgdGVzdEhlbHBlcjsKLQkJYXNzZXJ0VHJ1ZSgodGVzdENsYXNzKS5pc0V4aXN0aW5nVHlwZSgpKTsKLQkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlMaXN0IG1ldGhvZHMgPSB0ZXN0Q2xhc3MuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJ0ZXN0MTMiKSkgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQltZXRob2QgPSBudWxsOwotCQkJfQotCQl9Ci0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJCi0JCS8vVmVyaWZ5IHBhcmFtZXRlcnMKLQkJTGlzdCBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQlhc3NlcnRUcnVlKHBhcmFtcy5zaXplKCkgPT0gMSk7Ci0JCi0JCQotCQkvLyBWZXJpZnkgWSBwYXJhbQotCQlKYXZhUGFyYW1ldGVyIHBhcmFtMSA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KDApOwotCQlpZiAoaXNSZWZsZWN0aW5nU291cmNlKQotCQkJYXNzZXJ0VHJ1ZShwYXJhbTEuZ2V0TmFtZSgpLmVxdWFscygicGFyYW0iKSk7Ci0JCUphdmFIZWxwZXJzIHBhcmFtMVR5cGUgPSBwYXJhbTEuZ2V0SmF2YVR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJhbTFUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmlvLlNlcmlhbGl6YWJsZSIsIHBhcmFtMVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTZXJpYWxpemFibGUiLCBwYXJhbTFUeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSmF2YVByb2plY3RVdGlsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KYXZhUHJvamVjdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlMDQxYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KYXZhUHJvamVjdFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YVByb2plY3RVdGlsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE2ICQgICREYXRlOiAyMDA3LzA0LzAxIDAzOjI4OjE4ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50UnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luOwotCi0vKioKLSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gYmUgYSB1dGlsaXR5IGZvciBtYW5pcHVsYXRpbmcvcG9wdWxhdGluZyBqYXZhIHByb2plY3RzLgotICogIDEpIEdldCBhIGphdmEgcHJvamVjdCBhcyBvbmUgb2YgdGhlIHJlc291cmNlcy4KLSAqICAyKSBDcmVhdGUgYSBwcm9qZWN0IGZyb20gYSBkaXJlY3RvcnkuIFRoZSBkaXJlY3RvcnkgbmVlZHMgdG8gYmUgYWxsIHNldCB1cCB0byBiZSBhIHByb2plY3QgYWxyZWFkeS4gVHlwaWNhbGx5Ci0gKiAgICAgZnJvbSBhbiB1bnppcC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSmF2YVByb2plY3RVdGlsIHsJCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJcmV0dXJuIChwcm9qZWN0LmV4aXN0cygpKSA/IHByb2plY3Q6IG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIENyZWF0ZSBhIHByb2plY3QgZnJvbSB0aGUgcGF0aC4gVGhlIHBhdGggd2lsbCBiZSBhIGNvbXBsZXRlIHByb2plY3QsIGluY2x1ZGluZyBhIC5wcm9qZWN0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHdvcmtzcGFjZQotCSAqIEBwYXJhbSBwcm9qZWN0UGF0aCBOZWVkcyB0byBiZSBhIGNvbXBsZXRlIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBmaWxlIHN5c3RlbS4gVGhlIGRpcmVjdG9yeSBtdXN0IGJlIGEgY29tcGxldGUgcHJvamVjdCBpbmNsdWRpbmcgLnByb2plY3QgZmlsZS4KLQkgKiBAcGFyYW0gcG0KLQkgKiBAcmV0dXJuIFRoZSBuZXcgSVByb2plY3QuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KElXb3Jrc3BhY2Ugd29ya3NwYWNlLCBJUGF0aCBwcm9qZWN0UGF0aCwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIG5ld0Rlc2NyaXB0aW9uID0gbnVsbDsKLQkJCi0JCUZpbGUgcHJvamVjdEZpbGUgPSBuZXcgRmlsZShwcm9qZWN0UGF0aC50b0ZpbGUoKSwgSVByb2plY3REZXNjcmlwdGlvbi5ERVNDUklQVElPTl9GSUxFX05BTUUpOwotCQlpZiAoIXByb2plY3RGaWxlLmV4aXN0cygpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJQcm9qZWN0IGZpbGUgbm90IGluIHByb2plY3QgZGlyZWN0b3J5LiBDb3VsZG4ndCBjcmVhdGUgcHJvamVjdCBcIiIrcHJvamVjdFBhdGgudG9TdHJpbmcoKSsiXCIiLCBudWxsKSk7Ci0KLQotCQlJUGF0aCBwcm9qZWN0RmlsZVBhdGggPSBuZXcgUGF0aChwcm9qZWN0RmlsZS5nZXRQYXRoKCkpOwotCQluZXdEZXNjcmlwdGlvbiA9IHdvcmtzcGFjZS5sb2FkUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3RGaWxlUGF0aCk7Ci0JCQotCQkvLyBjcmVhdGUgdGhlIG5ldyBwcm9qZWN0IG9wZXJhdGlvbgotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KG5ld0Rlc2NyaXB0aW9uLmdldE5hbWUoKSk7CQkKLQkJZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CQkKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlwcm9qZWN0LmNyZWF0ZShkZXNjcmlwdGlvbiwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkJcHJvamVjdC5vcGVuKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwkJCQkKLQkJCX0KLQkJfSwgcHJvamVjdCwgMCwgcG0pOwotCQkKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGVtcHR5IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSByb290LiBJZiB0aGVyZSBpcyBhIC5wcm9qZWN0IGZpbGUgYWxyZWFkeSB0aGVyZSwgdGhlbiB1c2UgaXQuCi0JICogQHBhcmFtIHdvcmtzcGFjZSBUaGUgd29ya3NwYWNlIHRvIGNyZWF0ZSBwcm9qZWMgaW4uCi0JICogQHBhcmFtIHByb2plY3RQYXRoIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LiBJdCBzaG91bGQgb25seSBiZSBvbmUgc2VnbWVudCBsb25nLCBhbmQgdGhhdCB3aWxsIGJlIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LgotCSAqIEBwYXJhbSBwbQotCSAqIEByZXR1cm4gVGhlIHByb2plY3QuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVFbXB0eUphdmFQcm9qZWN0KElXb3Jrc3BhY2Ugd29ya3NwYWNlLCBJUGF0aCBwcm9qZWN0UGF0aCwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlwcm9qZWN0UGF0aCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQocHJvamVjdFBhdGgpOwkvLyBQdXQgaXQgaW50byB0aGUgd29ya3NwYWNlIHJlbGF0aXZlLgotCQlGaWxlIHByb2plY3RGaWxlID0gbmV3IEZpbGUocHJvamVjdFBhdGgudG9GaWxlKCksIElQcm9qZWN0RGVzY3JpcHRpb24uREVTQ1JJUFRJT05fRklMRV9OQU1FKTsKLQkJaWYgKHByb2plY3RGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIGNyZWF0ZVByb2plY3Qod29ya3NwYWNlLCBwcm9qZWN0UGF0aCwgcG0pOwkvLyBMZXQgaXQgYmUgY3JlYXRlZCBub3JtYWxseS4KLQotCQkvLyBjcmVhdGUgdGhlIG5ldyBwcm9qZWN0IG9wZXJhdGlvbgotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3RQYXRoLmxhc3RTZWdtZW50KCkpOwkJCi0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsJCQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXByb2plY3QuY3JlYXRlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotCQkJCXByb2plY3Qub3BlbihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApKTsKLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCVN0cmluZ1tdIG5hdHVyZWlkcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmF0dXJlaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChuYXR1cmVpZHNbaV0uZXF1YWxzKCJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIikpCi0JCQkJCQlyZXR1cm47CS8vIEFscmVhZHkgaGFzIG5hdHVyZS4KLQkJCQl9Ci0JCQkJU3RyaW5nW10gbmV3TmF0dXJlaWRzID0gbmV3IFN0cmluZ1tuYXR1cmVpZHMubGVuZ3RoKzFdOwotCQkJCW5ld05hdHVyZWlkc1swXSA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIjsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG5hdHVyZWlkcywgMCwgbmV3TmF0dXJlaWRzLCAxLCBuYXR1cmVpZHMubGVuZ3RoKTsKLQkJCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlaWRzKTsKLQkJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApKTsKLQkJCQkvLyBOZWVkIHRvIHB1dCBvdXQgYSBjbGFzc2ZpbGUgdG9vLiBXZSBuZWVkIGEgc3JjIGFuZCBhIGJpbiBkaXJlY3RvcnkgZm9yIHRoZSBjbGFzc3BhdGguCi0JCQkJSUZvbGRlciBzZiA9IHByb2plY3QuZ2V0Rm9sZGVyKCJzcmMiKTsKLQkJCQlzZi5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkJSUZvbGRlciBiZiA9IHByb2plY3QuZ2V0Rm9sZGVyKCJiaW4iKTsKLQkJCQliZi5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkJSUZpbGUgY3AgPSBwcm9qZWN0LmdldEZpbGUoIi5jbGFzc3BhdGgiKTsgCi0JCQkJdHJ5IHsKLQkJCQkJY3AuY3JlYXRlKGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi5jbGFzc3BhdGgiKS5vcGVuU3RyZWFtKCksIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0sIHdvcmtzcGFjZS5nZXRSb290KCksIDAsIHBtKTsKLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgYSBwcm9qZWN0IGFuZCBhbGwgZmlsZXMgZnJvbSB0aGUgcHJvamVjdC4KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgZmFsc2UsIG51bGwpOyAvLyBHZXQgcmlkIG9mIHRoZSBwcm9qZWN0IGFuZCB0aGUgZmlsZXMgdGhlbXNlbHZlcy4KLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgd29ya3NwYWNlIGF1dG9idWlsZCB0byB0aGUgc3BlY2lmaWVkIHN0YXRlLiBJdCByZXR1cm5zIHdoYXQKLQkgKiB0aGUgc3RhdGUgd2FzIHByZXZpb3VzbHkgc28gdGhhdCBpdCBjYW4gYmUgbGF0ZXIgcmVzdG9yZWQuCi0JICogQHBhcmFtIGF1dG9CdWlsZAotCSAqIEByZXR1cm4gUHJldmlvdXMgYXV0b0J1aWxkIHN0YXRlLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXRBdXRvQnVpbGQoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCWlmIChhdXRvQnVpbGQgIT0gd29ya3NwYWNlLmlzQXV0b0J1aWxkaW5nKCkpIHsKLQkJCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotCQkJZGVzY3JpcHRpb24uc2V0QXV0b0J1aWxkaW5nKHRydWUpOwotCQkJd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJCXJldHVybiAhYXV0b0J1aWxkOwkvLyBJdCB3YXNuJ3QgdGhpcyBzdGF0ZS4JCQkKLQkJfSBlbHNlCi0JCQlyZXR1cm4gYXV0b0J1aWxkOwkvLyBJdCBhbHJlYWR5IGlzIHRoaXMgc3RhdGUuIAkJCi0JfQotCQotCS8qKgotCSAqIEltcG9ydCB0aGUgZ2l2ZW4gcHJvamVjdHMgZnJvbSB0aGUgZ2l2ZW4gemlwZmlsZXMgaW50byB0aGUgY3VycmVudCB3b3Jrc3BhY2Ugcm9vdC4KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWVzIFRoZSBhcnJheSBvZiBwcm9qZWN0IG5hbWVzIHRvIGNyZWF0ZQotCSAqIEBwYXJhbSB6aXBGaWxlcyBUaGUgemlwZmlsZXMgY29udGFpbmluZyBlYWNoIHByb2plY3QuIEl0IG11c3QgYmUgYSBjb21wbGV0ZSBwcm9qZWN0LiAKLQkgKiAgICAgICAgICAgICAgICAgVGhlIGZpcnN0IGRpcmVjdG9yeSBpbiB0aGUgemlwIG11c3QgYmUgdGhlIHByb2plY3QgZGlyZWN0b3J5LiAKLQkgKiAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSB0aGUgc2FtZSBuYW1lIGFzIGZyb20gcHJvamVjdE5hbWVzLiBBbHNvIGl0IG11c3QgaW5jbHVkZSBhIC5wcm9qZWN0IGZpbGUKLQkgKiAgICAgICAgICAgICAgICAgaW4gdGhhdCBkaXJlY3RvcnkuCi0JICogQHJldHVybiBUaGUgYXJyYXkgb2YgSVByb2plY3RzIHRoYXQgd2VyZSBjcmVhdGVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBpbXBvcnRQcm9qZWN0cyhmaW5hbCBTdHJpbmdbXSBwcm9qZWN0TmFtZXMsIGZpbmFsIFN0cmluZ1tdIHppcEZpbGVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIERlbGV0ZS9jcmVhdGUvcG9wdWxhdGUgd2l0aGluIGEgcnVubmFibGUgc28gdGhhdCB0aGUgYnVpbGQgaXMgZG9uZSBvbmx5IGFmdGVyIGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLgotCQkvLyBNYWtlIHN1cmUgYXV0b2J1aWxkIGlzIG9uLgotCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJZmluYWwgSVByb2plY3RbXSByZXN1bHQgPSBuZXcgSVByb2plY3RbcHJvamVjdE5hbWVzLmxlbmd0aF07Ci0JCXdvcmtzcGFjZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkvLyBGaXJzdCBpbXBvcnQgYWxsLCB0aGVuIGFmdGVyIHRoYXQsIGNyZWF0ZSB0aGUgcHJvamVjdHMuCi0JCQkJSVBhdGggcm9vdExvY2F0aW9uID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBhbnRGaWxlID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKEphdmFUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgidGVzdGRhdGEvdW56aXAueG1sIikpLmdldEZpbGUoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB6aXBGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJLy8gRmlyc3QgY3JlYXRlL3JlY3JlYXRlIHRoZSBwcm9qZWN0LgotCQkJCQkJSVByb2plY3QgcCA9IGdldFByb2plY3QocHJvamVjdE5hbWVzW2ldKTsKLQkJCQkJCWlmIChwICE9IG51bGwpCi0JCQkJCQkJcC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA1MCkpOyAvLyBHZXQgcmlkIG9mIGl0LCB3ZSB3YW50IGEgY2xlYW4gb25lIGZvciB0ZXN0aW5nLgotCQkJCQkKLQkJCQkJCS8vIE5vdyBpbXBvcnQgdGhlIHJlcXVlc3RlZCBmaWxlcy4KLQkJCQkJCUFudFJ1bm5lciBhbnQgPSBuZXcgQW50UnVubmVyKCk7Ci0JCQkJCQlhbnQuc2V0QnVpbGRGaWxlTG9jYXRpb24oYW50RmlsZSk7Ci0JCQkJCQlhbnQuc2V0QXJndW1lbnRzKG5ldyBTdHJpbmdbXSB7ICItRHppcGZyb209IiArIHppcEZpbGVzW2ldLCAiLUR6aXB0bz0iICsgcm9vdExvY2F0aW9uLnRvU3RyaW5nKCl9KTsKLQkJCQkJCWFudC5ydW4obmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA1MCkpOwotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgemlwRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXJlc3VsdFtpXSA9IGNyZWF0ZVByb2plY3Qod29ya3NwYWNlLCByb290TG9jYXRpb24uYXBwZW5kKHByb2plY3ROYW1lc1tpXSksIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNTApKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfSwgd29ya3NwYWNlLmdldFJvb3QoKSwgMCwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBpbnQgY2ZTdWZmaXggPSAwOwotCS8qKgotCSAqIEFkZCBhIHBhdGggdG8gcGx1Z2luIGphciB0byB0aGUgamF2YSBwcm9qZWN0J3MgY2xhc3MgcGF0aC4KLQkgKiBAcGFyYW0gYnVuZGxlIFRoZSBwbHVnaW4gd2hlcmUgdGhlIGphciBpcyBsb2NhdGVkLgotCSAqIEBwYXJhbSBwYXRoVG9KYXIgUGF0aCB0byB0aGUgamFyIHdpdGhpbiB0aGUgYWJvdmUgcGx1Z2luCi0JICogQHBhcmFtIHByb2plY3QgamF2YSBwcm9qZWN0IHRvIGFkZCB0by4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQnVuZGxlSmFyVG9QYXRoKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBwYXRoVG9KYXIsIGZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElQYXRoIGFjdHVhbFBhdGggPSBuZXcgUGF0aChQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5sb2NhbGl6ZUZyb21CdW5kbGVBbmRGcmFnbWVudHMoYnVuZGxlLCBwYXRoVG9KYXIpKTsKLQkJaWYgKGFjdHVhbFBhdGguaXNFbXB0eSgpKQotCQkJcmV0dXJuOwkvLyBEaWRuJ3QgZXhpc3QuCi0JCQotCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJd29ya3NwYWNlLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewkJCi0JCQkJaWYgKGFjdHVhbFBhdGgudG9GaWxlKCkuaXNGaWxlKCkpIHsKLQkJCQkJLy8gSXQgaXMgYSBqYXIsIHRoaXMgd2lsbCBiZSBkdXJpbmcgcnVudGltZQotCQkJCQkvLyBDcmVhdGUgYW4gZXh0ZXJuYWwgamFyIGVudHJ5LgotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSByYXcgPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdSYXcgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3Jhdy5sZW5ndGgrMV07Ci0JCQkJCW5ld1Jhd1tyYXcubGVuZ3RoXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShhY3R1YWxQYXRoLCBudWxsLCBudWxsKTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShyYXcsIDAsIG5ld1JhdywgMCwgcmF3Lmxlbmd0aCk7Ci0JCQkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld1JhdywgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDApKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBJdCBpcyBhIHBhdGggdG8gY2xhc3MgZm9sZGVyLCB0aGlzIHdpbGwgYmUgZHVyaW5nIGRldmVsb3BtZW50IHRpbWUuCi0JCQkJCS8vIEJ1dCBjbGFzc2ZvbGRlcnMgTVVTVCBleGlzdCBpbiB0aGUgd29ya3NwYWNlLiBKRFQgZG9lc24ndCB1bmRlcnN0YW5kIHRoZW0gb3V0c2lkZSB3b3Jrc3BhY2UsCi0JCQkJCS8vIHNvIHdlIHdpbGwgbGluayBpdCBpbnRvIHRoZSBwcm9qZWN0LgotCQkJCQlJRm9sZGVyIGNmID0gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsaW5rYmluIisoKytjZlN1ZmZpeCkpOwotCQkJCQljZi5jcmVhdGVMaW5rKGFjdHVhbFBhdGgsIDAsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwKSk7Ci0JCQkJCS8vIENyZWF0ZSBjbGFzcyBmb2xkZXIgZW50cnkuCi0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIHJhdyA9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld1JhdyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbcmF3Lmxlbmd0aCsxXTsKLQkJCQkJbmV3UmF3W3Jhdy5sZW5ndGhdID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGNmLmdldEZ1bGxQYXRoKCksIG51bGwsIG51bGwpOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJhdywgMCwgbmV3UmF3LCAwLCByYXcubGVuZ3RoKTsKLQkJCQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3UmF3LCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMCkpOwotCQkJCX0KLQkJCX0KLQkJfSwgd29ya3NwYWNlLmdldFJvb3QoKSwgMCwgcG0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckF1dG9CdWlsZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUpvYk1hbmFnZXIgam9iTWFuYWdlciA9IEpvYi5nZXRKb2JNYW5hZ2VyKCk7Ci0JCWlmIChqb2JNYW5hZ2VyLmZpbmQoUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxEKS5sZW5ndGggPiAwKSB7Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCXRyeSB7Ci0JCQkJCWpvYk1hbmFnZXIuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlicmVhazsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KYXZhVGVzdHNQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0phdmFUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWQ2MmFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0phdmFUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHM7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhVGVzdHNQbHVnaW4uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEphdmFUZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBKYXZhVGVzdHNQbHVnaW4gUExVR0lOOwotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIEphdmFUZXN0c1BsdWdpbigpIHsKLQkJUExVR0lOID0gdGhpczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKYXZhVGVzdHNQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gUExVR0lOOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvVUlUZXN0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL1VJVGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOGE3NjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvVUlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHM7Ci0KLS8qKgotICogVGhpcyBpcyB1c2VkIHRvIG1ha2UgdGhlIEpFTSB0ZXN0cyBydW4gaW4gVUkgbW9kZSBpbnN0ZWFkIG9mIEhFQURMRVNTIG1vZGUsCi0gKiBldmVuIHRob3VnaCBhIFVJIGlzIG5vdCBhdmFpbGFibGUuIFRoZSB0ZXN0cyB3aWxsIG5vcm1hbGx5IG5lZWQgdGhhdCBtb2RlLgotICovCi1wdWJsaWMgY2xhc3MgVUlUZXN0ZXIgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSVRlc3RlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnd0cC5jb21tb24uVUlUZXN0ZXIjaXNDdXJyZW50Q29udGV4dFVJKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnRDb250ZXh0VUkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmFzaWMvQmFzaWNTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmFzaWMvQmFzaWNTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjRmZmI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2Jhc2ljL0Jhc2ljU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQmFzaWNTdWl0ZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjU2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJhc2ljOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVByb2plY3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhVGVzdHNQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyBiYXNpYyBKRU0gdGVzdGluZyBub3QgY292ZXJlZCBieSBzcGVjaWZpYyBjb21wb25lbnRzIHRlc3RzLgotICogCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNTdWl0ZSBleHRlbmRzIFRlc3RTZXR1cCB7Ci0KLQkvLyBUZXN0IGNhc2VzIHRvIGJlIGluY2x1ZGUgaW4gdGhlIHN1aXRlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgdGVzdHNMaXN0W10gPSB7IFRlc3RXb3JrYmVuY2hVdGlsczExMjY3OC5jbGFzc307Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQmFzaWNTdWl0ZSgpIHsKLQkJdGhpcygiVGVzdCBCYXNpYyBKRU0gU3VpdGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBCYXNpY1N1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5ldyBUZXN0U3VpdGUobmFtZSkgewotCQkJewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHNMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pOwotCQkJCX0KLQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgQmFzaWNTdWl0ZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQkFTSUNfUFJPSkVDVCA9ICJUZXN0IEJhc2ljIjsJLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgYm9vbGVhbiBvbGRBdXRvQnVpbGRpbmdTdGF0ZTsgLy8gYXV0b0J1aWxkaW5nIHN0YXRlIGJlZm9yZSB3ZSBzdGFydGVkLgkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tIEluaXRpYWxpemluZyB0aGUgQmFzaWMgdGVzdCBkYXRhIC0tIik7IC8vJE5PTi1OTFMtMSQKLQkJb2xkQXV0b0J1aWxkaW5nU3RhdGUgPSBKYXZhUHJvamVjdFV0aWwuc2V0QXV0b0J1aWxkKHRydWUpOwotCQlVUkwgaW5zdGFsbFVSTCA9IEphdmFUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotCQlTdHJpbmdbXSB6aXBQYXRocyA9IG5ldyBTdHJpbmdbMV07Ci0JCXppcFBhdGhzWzBdID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKG5ldyBVUkwoaW5zdGFsbFVSTCwgInRlc3RkYXRhL3Rlc3RiYXNpYy56aXAiKSkuZ2V0RmlsZSgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0KLQkJCUphdmFQcm9qZWN0VXRpbC5pbXBvcnRQcm9qZWN0cygKLQkJCQluZXcgU3RyaW5nW10geyBURVNUX0JBU0lDX1BST0pFQ1QgfSwKLQkJCQl6aXBQYXRocyk7Ci0JCWFzc2VydE5vdE51bGwocHJvamVjdHNbMF0pOwotCQlKYXZhUHJvamVjdFV0aWwud2FpdEZvckF1dG9CdWlsZCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tIERhdGEgaW5pdGlhbGl6ZWQgLS0iKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCUphdmFQcm9qZWN0VXRpbC5kZWxldGVQcm9qZWN0KEphdmFQcm9qZWN0VXRpbC5nZXRQcm9qZWN0KFRFU1RfQkFTSUNfUFJPSkVDVCkpOwotCQkJfQotCQl9LCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCAwLCBudWxsKTsKLQotCQlKYXZhUHJvamVjdFV0aWwuc2V0QXV0b0J1aWxkKG9sZEF1dG9CdWlsZGluZ1N0YXRlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2Jhc2ljL1Rlc3RXb3JrYmVuY2hVdGlsczExMjY3OC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmFzaWMvVGVzdFdvcmtiZW5jaFV0aWxzMTEyNjc4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZDM4NDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmFzaWMvVGVzdFdvcmtiZW5jaFV0aWxzMTEyNjc4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVGVzdFdvcmtiZW5jaFV0aWxzMTEyNjc4LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMTAvMTQgMjA6NTc6MzAgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmFzaWM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotIAotCi0vKioKLSAqIFRlc3QgYnVnOiAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjY3OAotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0V29ya2JlbmNoVXRpbHMxMTI2NzggZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgVGVzdFdvcmtiZW5jaFV0aWxzMTEyNjc4KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFRlc3RXb3JrYmVuY2hVdGlsczExMjY3OChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9SRVNPVVJDRV9QQVRIID0gIlRlc3QgQmFzaWMvd29ya2JlbmNoVXRpbC9GaWxlUmVzb3VyY2UueG1pIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRk9VTkRfRklMRV9SRVNPVVJDRV9QQVRIID0gIlRlc3QgQmFzaWMvd29ya2JlbmNoVXRpbC9Ob0ZpbGVSZXNvdXJjZS54bWkiOwotCQotCS8qKgotCSAqIFRlc3Qge0BsaW5rIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZSNnZXRJRmlsZShVUkkpfSB3aXRoIHBsYXRmb3JtIHJlc291cmNlIHVyaS4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SUZpbGVQbGF0Zm9ybVJlc291cmNlKCkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoRklMRV9SRVNPVVJDRV9QQVRIKTsKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRJRmlsZSh1cmkpOwotCQlhc3NlcnROb3ROdWxsKGZpbGUpOwotCQlhc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOwotCi0JCXVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKE5PVF9GT1VORF9GSUxFX1JFU09VUkNFX1BBVEgpOwotCQlmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldElGaWxlKHVyaSk7Ci0JCWFzc2VydE5vdE51bGwoZmlsZSk7Ci0JCWFzc2VydEZhbHNlKGZpbGUuZXhpc3RzKCkpOwotCQkKLQkJLy8gVGVzdCBhIHJlbGF0aXZlIGZvcm0gdGhhdCBpcyBub3QgYSB2YWxpZCBwcm9qZWN0LgotCQl1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSSgiTm90UHJvamVjdC9maWxlLnhtaSIpOyAJCi0JCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUodXJpKTsKLQkJYXNzZXJ0TnVsbChmaWxlKTsJCQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHtAbGluayBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UjZ2V0SUZpbGUoVVJJKX0gd2l0aCBhIHJlbGF0aXZlIHVyaSAoZS5nLiAicHJvamVjdC9maWxlIikuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldElGaWxlUHJvamVjdFJlbGF0aXZlUmVzb3VyY2UoKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKEZJTEVfUkVTT1VSQ0VfUEFUSCk7Ci0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUodXJpKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWxlKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKLQotCQl1cmkgPSBVUkkuY3JlYXRlVVJJKE5PVF9GT1VORF9GSUxFX1JFU09VUkNFX1BBVEgpOwotCQlmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldElGaWxlKHVyaSk7Ci0JCWFzc2VydE5vdE51bGwoZmlsZSk7Ci0JCWFzc2VydEZhbHNlKGZpbGUuZXhpc3RzKCkpOwotCQkKLQkJLy8gVGVzdCBhIHJlbGF0aXZlIGZvcm0gdGhhdCBpcyBub3QgYSB2YWxpZCBwcm9qZWN0LgotCQl1cmkgPSBVUkkuY3JlYXRlVVJJKCJOb3RQcm9qZWN0L2ZpbGUueG1pIik7IAkKLQkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRJRmlsZSh1cmkpOwotCQlhc3NlcnROdWxsKGZpbGUpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB7QGxpbmsgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlI2dldElGaWxlKFVSSSl9IHdpdGggYSBub24tcGxhdGZvcm0gcmVzb3VyY2UgdXJpLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRJRmlsZU5vdFBsYXRmb3JtUmVzb3VyY2UoKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcGx1Z2luL3h5ei9hYmMiKTsKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRJRmlsZSh1cmkpOwotCQlhc3NlcnROdWxsKGZpbGUpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHtAbGluayBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UjZ2V0UmVzb3VyY2UoVVJJKX0gd2l0aCBhIHBsYXRmb3JtIHJlc291cmNlIHVyaS4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzb3VyY2VQbGF0Zm9ybVJlc291cmNlKCkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoRklMRV9SRVNPVVJDRV9QQVRIKTsKLQkJUmVzb3VyY2UgcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKHVyaSk7Ci0JCWFzc2VydE5vdE51bGwocmVzKTsKLQkJYXNzZXJ0VHJ1ZShyZXMuaXNMb2FkZWQoKSk7Ci0JCQotCQl1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShOT1RfRk9VTkRfRklMRV9SRVNPVVJDRV9QQVRIKTsKLQkJYm9vbGVhbiBnb29kID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlyZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UodXJpKTsKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlnb29kID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGdvb2QpOwotCi0JCS8vIFRlc3QgYSByZWxhdGl2ZSBmb3JtIHRoYXQgaXMgbm90IGEgdmFsaWQgcHJvamVjdC4KLQkJdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoIk5vdFByb2plY3QvZmlsZS54bWkiKTsgCQotCQlyZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UodXJpKTsKLQkJYXNzZXJ0TnVsbChyZXMpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHtAbGluayBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UjZ2V0UmVzb3VyY2UoVVJJKX0gd2l0aCBhIHJlbGF0aXZlIHVyaSAoZS5nLiAicHJvamVjdC9maWxlIikuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldFJlc291cmNlUHJvamVjdFJlbGF0aXZlUmVzb3VyY2UoKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKEZJTEVfUkVTT1VSQ0VfUEFUSCk7Ci0JCVJlc291cmNlIHJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZSh1cmkpOwotCQlhc3NlcnROb3ROdWxsKHJlcyk7Ci0JCWFzc2VydFRydWUocmVzLmlzTG9hZGVkKCkpOwotCQkKLQkJYm9vbGVhbiBnb29kID0gZmFsc2U7Ci0JCXVyaSA9IFVSSS5jcmVhdGVVUkkoTk9UX0ZPVU5EX0ZJTEVfUkVTT1VSQ0VfUEFUSCk7Ci0JCXRyeSB7Ci0JCQlyZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UodXJpKTsKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlnb29kID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGdvb2QpOwotCi0JCS8vIFRlc3QgYSByZWxhdGl2ZSBmb3JtIHRoYXQgaXMgbm90IGEgdmFsaWQgcHJvamVjdC4KLQkJdXJpID0gVVJJLmNyZWF0ZVVSSSgiTm90UHJvamVjdC9maWxlLnhtaSIpOyAJCi0JCXJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZSh1cmkpOwotCQlhc3NlcnROdWxsKHJlcyk7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9BYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0ZDI4Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9BYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvOwotLyoKLSAqICAkUkNTZmlsZTogQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEwICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhUHJvamVjdFV0aWw7Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJlYW5pbmZvTmF0dXJlIG5hdHVyZTsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcnNldDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIAotCQlURVNUX0JFQU5JTkZPX1BST0pFQ1QgPSAiVGVzdCBCZWFuSW5mbyIsCS8vJE5PTi1OTFMtMSQKLQkJVEVTVF9CRUFOSU5GT19CRUFOSU5GT1NfUFJPSkVDVCA9ICJUZXN0IEJlYW5JbmZvIEJlYW5JbmZvcyIsIC8vJE5PTi1OTFMtMSQKLQkJVEVTVF9CRUFOSU5GT19QUkVSRVFfUFJPSkVDVCA9ICJUZXN0IEJlYW5JbmZvIFByZXJlcSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJSVByb2plY3QgYmlQcm9qZWN0ID0gSmF2YVByb2plY3RVdGlsLmdldFByb2plY3QoVEVTVF9CRUFOSU5GT19QUk9KRUNUKTsKLQkJYXNzZXJ0Tm90TnVsbChiaVByb2plY3QpOyAKLQkJbmF0dXJlID0gQmVhbmluZm9OYXR1cmUuZ2V0UnVudGltZShiaVByb2plY3QpOwotCQlhc3NlcnROb3ROdWxsKG5hdHVyZSk7Ci0JCXJzZXQgPSBuYXR1cmUuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJYXNzZXJ0Tm90TnVsbChyc2V0KTsKLQkJLy8gV2UgYWxzbyB3YW50IHRvIHJlbW92ZSBhbnkgYmVhbmluZm9zIGZyb20gdGhlIHNlYXJjaCBwYXRoIHRoYXQgYXJlbid0IGZyb20gdGVzdGluZyBzbyB0aGF0IHdlIGRvbid0IGdldCBhbnkgd2VpcmQgc2lkZS1lZmZlY3RzLgotCQlQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IG5hdHVyZS5nZXRSZWdpc3RyeSgpOwotCQlJQXJyYXlCZWFuUHJveHkgc3AgPSBVdGlsaXRpZXMuZ2V0QmVhbkluZm9TZWFyY2hQYXRoKHJlZ2lzdHJ5KTsKLQkJLy8gcmVtb3ZlIGFueSB0aGF0IGRvbid0IHN0YXJ0IHdpdGggb3JnLmVjbGlwc2UuamVtLnRlc3RzLgotCQlpbnQgbGVuID0gc3AuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCVN0cmluZyBwYXRoID0gKChJU3RyaW5nQmVhblByb3h5KSBzcC5nZXQoaSkpLnN0cmluZ1ZhbHVlKCk7Ci0JCQlpZiAoIXBhdGguc3RhcnRzV2l0aCgib3JnLmVjbGlwc2UuamVtLnRlc3RzIikpCi0JCQkJVXRpbGl0aWVzLnJlbW92ZUJlYW5JbmZvUGF0aChyZWdpc3RyeSwgcGF0aCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBvYmpGZWF0dXJlcywgb2JqTm9uUHJvcGVydGllczsJLy8gT2JqZWN0IGZlYXR1cmVzIGNvdW50IGFuZCBPYmplY3Qgbm9uLXByb3BlcnRpZXMgY291bnQuIFRoaXMgaXMgb25seSBpbml0aWFsaXplZCBhcyBuZWVkZWQuCi0JcHJvdGVjdGVkIFNldCBvYmpGZWF0dXJlc1NldDsKLQkvKioKLQkgKiBUbyBpbml0aWFsaXplIHRoZSBvYmpGZWF0dXJlcyBhbmQgb2JqTm9uUHJvcGVydGllcyBjb3VudHMgd2hlbiBuZWNlc3NhcnkuIE5vdCBuZWVkZWQgZm9yIGFsbCB0ZXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvYmpGZWF0dXJlc1NldHVwKCkgewotCQkvLyBHZXQgdGhlIG51bWJlciBvZiBmZWF0dXJlcyB0aGF0IGphdmEubGFuZy5PYmplY3QgaGFzOgotCQlKYXZhQ2xhc3Mgb2JqQ2xhc3MgPSAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovamF2YS5sYW5nI09iamVjdCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlvYmpGZWF0dXJlc1NldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCW9iakZlYXR1cmVzID0gb2JqQ2xhc3MuZ2V0UHJvcGVydGllcygpLnNpemUoKTsKLQkJLy8gRmluZCB0aGUgbnVtYmVyIG9mIGFsd2F5cyBpbmhlcml0ZWQgcHJvcGVydGllcy4KLQkJb2JqTm9uUHJvcGVydGllcyA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXRyMCA9IG9iakNsYXNzLmdldFByb3BlcnRpZXMoKS5pdGVyYXRvcigpOyBpdHIwLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRyMC5uZXh0KCk7Ci0JCQlvYmpGZWF0dXJlc1NldC5hZGQocCk7Ci0JCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihwKTsKLQkJCWlmICggcGQgPT0gbnVsbCB8fCAocGQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMICYmICFwZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKSkKLQkJCQlvYmpOb25Qcm9wZXJ0aWVzKys7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL0JlYW5JbmZvU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL0JlYW5JbmZvU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmYmJkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9CZWFuSW5mb1N1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbzsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5JbmZvU3VpdGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTMgJCAgJERhdGU6IDIwMDcvMDMvMTQgMTc6MjY6NTkgJCAKLSAqLwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhUHJvamVjdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFUZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogVGhpcyBpcyB0aGUgdHJ1ZSB0ZXN0IHN1aXRlIGZvciBCZWFuaW5mbyBUZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgQmVhbkluZm9TdWl0ZSBleHRlbmRzIFRlc3RTZXR1cCB7Ci0KLQkvLyBUZXN0IGNhc2VzIHRvIGJlIGluY2x1ZGUgaW4gdGhlIHN1aXRlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgdGVzdHNMaXN0W10gPQotCQl7IFRlc3RSZWZsZWN0aW9uLmNsYXNzLCAvLyBOT1RFOiBUaGlzIG9uZSBtdXN0IGFsd2F5cyBiZSBmaXJzdCBiZWNhdXNlIGl0IGRvZXMgc29tZSB0ZXN0cyB0aGF0IGRlcGVuZCBvbiB0aGlzLgotCQlUZXN0U3RhbmRhcmQuY2xhc3MsIC8qVGVzdEFXVFN3aW5nVUkuY2xhc3MqLyB9OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEJlYW5JbmZvU3VpdGUuCi0JICovCi0JcHVibGljIEJlYW5JbmZvU3VpdGUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmV3IFRlc3RTdWl0ZShuYW1lKSB7Ci0JCQl7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0c0xpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkJYWRkVGVzdFN1aXRlKHRlc3RzTGlzdFtpXSk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCX0KLQkKLQlwdWJsaWMgQmVhbkluZm9TdWl0ZSgpIHsKLQkJdGhpcygiVGVzdCBCZWFuSW5mbyBTdWl0ZSIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBCZWFuSW5mb1N1aXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG9sZEF1dG9CdWlsZGluZ1N0YXRlOyAvLyBhdXRvQnVpbGRpbmcgc3RhdGUgYmVmb3JlIHdlIHN0YXJ0ZWQuCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLSBJbml0aWFsaXppbmcgdGhlIEJlYW5JbmZvIHRlc3QgZGF0YSAtLSIpOyAvLyROT04tTkxTLTEkCi0JCW9sZEF1dG9CdWlsZGluZ1N0YXRlID0gSmF2YVByb2plY3RVdGlsLnNldEF1dG9CdWlsZCh0cnVlKTsKLQkJVVJMIGluc3RhbGxVUkwgPSBKYXZhVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLQkJU3RyaW5nW10gemlwUGF0aHMgPSBuZXcgU3RyaW5nWzNdOwotCQl6aXBQYXRoc1swXSA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChuZXcgVVJMKGluc3RhbGxVUkwsICJ0ZXN0ZGF0YS90ZXN0YmVhbmluZm8uemlwIikpLmdldEZpbGUoKTsKLQkJemlwUGF0aHNbMV0gPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTChpbnN0YWxsVVJMLCAidGVzdGRhdGEvdGVzdGJlYW5pbmZvYmVhbmluZm9zLnppcCIpKS5nZXRGaWxlKCk7Ci0JCXppcFBhdGhzWzJdID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKG5ldyBVUkwoaW5zdGFsbFVSTCwgInRlc3RkYXRhL3Rlc3RiZWFuaW5mb3ByZXEuemlwIikpLmdldEZpbGUoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9Ci0JCQlKYXZhUHJvamVjdFV0aWwuaW1wb3J0UHJvamVjdHMoCi0JCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fUFJPSkVDVCwKLQkJCQkJQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fQkVBTklORk9TX1BST0pFQ1QsCi0JCQkJCUFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BSRVJFUV9QUk9KRUNUIH0sCi0JCQkJemlwUGF0aHMpOwotCQlhc3NlcnROb3ROdWxsKHByb2plY3RzWzBdKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0c1sxXSk7Ci0JCWFzc2VydE5vdE51bGwocHJvamVjdHNbMl0pOwotCQlKYXZhUHJvamVjdFV0aWwud2FpdEZvckF1dG9CdWlsZCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tIERhdGEgaW5pdGlhbGl6ZWQgLS0iKTsgLy8kTk9OLU5MUy0xJAotCi0JCUJlYW5pbmZvTmF0dXJlIG5hdHVyZSA9IEJlYW5pbmZvTmF0dXJlLmdldFJ1bnRpbWUocHJvamVjdHNbMF0pOwotCQlhc3NlcnROb3ROdWxsKG5hdHVyZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCUphdmFQcm9qZWN0VXRpbC5kZWxldGVQcm9qZWN0KEphdmFQcm9qZWN0VXRpbC5nZXRQcm9qZWN0KEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BST0pFQ1QpKTsKLQkJCQlKYXZhUHJvamVjdFV0aWwuZGVsZXRlUHJvamVjdChKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19CRUFOSU5GT1NfUFJPSkVDVCkpOwotCQkJCUphdmFQcm9qZWN0VXRpbC5kZWxldGVQcm9qZWN0KEphdmFQcm9qZWN0VXRpbC5nZXRQcm9qZWN0KEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BSRVJFUV9QUk9KRUNUKSk7Ci0JCQl9Ci0JCX0sIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIDAsIG51bGwpOwotCi0JCUphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQob2xkQXV0b0J1aWxkaW5nU3RhdGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdEFXVFN3aW5nVUkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3RBV1RTd2luZ1VJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOWE1MDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdEFXVFN3aW5nVUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbzsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RBV1RTd2luZ1VJLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTUgJCAKLSAqLwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFUZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogQVdUL1N3aW5nIHRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QVdUU3dpbmdVSSBleHRlbmRzIEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVGVzdEFXVFN3aW5nVUkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgVGVzdEFXVFN3aW5nVUkoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qCi0JICogVGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIGtlZXAgaW5jcmVhc2luZyBieSB2ZXJzaW9uLAotCSAqIGJ1dCB0aGVyZSBpcyBhIG1pbmltYWwgc2V0LiBUaGlzIG1pbmltYWwgc2V0IHdpbGwgYmUKLQkgKiBzdG9yZWQgaW4gYSBmaWxlIGFuZCBjYW4gYmUgbG9hZGVkIGJ5IHRoaXMgbWV0aG9kLgotCSAqIFRoaXMgc2V0IGNhbiBiZSB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0IGF0IGxlYXN0IHRoZQotCSAqIHJlcXVpcmVkIHByb3BlcnRpZXMgYXJlIHRoZXJlLgotCSAqIAotCSAqIFRoZSBmaWxlbmFtZSBoYXMgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHRlc3RzIHBsdWdpbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU2V0IGdldE5hbWVzKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU2V0IG5hbWVzID0gbmV3IEhhc2hTZXQoNTApOwotCQlVUkwgdXJsID0gSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldEVudHJ5KGZpbGVuYW1lKTsKLQkJYXNzZXJ0Tm90TnVsbCh1cmwpOwotCQlCdWZmZXJlZFJlYWRlciByZHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHVybC5vcGVuU3RyZWFtKCkpKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJCXdoaWxlICgobGluZSA9IHJkci5yZWFkTGluZSgpKSAhPSBudWxsKQotCQkJCW5hbWVzLmFkZChsaW5lKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJkci5jbG9zZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JLyoKLQkgKiBUZXN0IHRoZSBuYW1lcyBhZ2FpbnN0IHRoZSBzZXQuIFByaW50IHRob3NlIG5vdCBmb3VuZCBpbiB0aGUgc2V0LCAKLQkgKiBvciB0aG9zZSBpbiB0aGUgYWdhaW5zdFNldCB0aGF0IHdlcmVuJ3QgZm91bmQuIFRocm93IGFzc2VydCBlcnJvciBpZgotCSAqIGFueSBmcm9tIGFnYWluc3Qgc2V0IG5vdCBmb3VuZC4gCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVzdEluY2x1ZGVzQWxsTmFtZXMoU3RyaW5nIGlkLCBMaXN0IHRlc3ROYW1lcywgU2V0IGFnYWluc3RTZXQsIFNldCBleGNsdWRlKSB7Ci0JCVNldCB3b3JraW5nQWdhaW5zdCA9IG5ldyBIYXNoU2V0KGFnYWluc3RTZXQuc2l6ZSgpKTsKLQkJd29ya2luZ0FnYWluc3QuYWRkQWxsKGFnYWluc3RTZXQpOwkvLyBUaGVyZSBtYXkgYmUgZHVwIHRlc3ROYW1lcyAobGlrZSBmb3Igb3BlcmF0aW9ucyksIHNvIGluIHRoYXQgY2FzZSB3ZSBsZWF2ZSBhZ2FpbnN0U2V0IGFsb25lLgotCQlib29sZWFuIHdyb3RlQW55ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gdGVzdE5hbWVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlFTmFtZWRFbGVtZW50IHRlc3ROYW1lID0gKEVOYW1lZEVsZW1lbnQpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoZXhjbHVkZS5jb250YWlucyh0ZXN0TmFtZSkpCi0JCQkJY29udGludWU7CS8vIFRoaXMgaXMgb25lIHdlIHdhbnQgdG8gaWdub3JlCi0JCQlpZiAoYWdhaW5zdFNldC5jb250YWlucyh0ZXN0TmFtZS5nZXROYW1lKCkpKQotCQkJCXdvcmtpbmdBZ2FpbnN0LnJlbW92ZSh0ZXN0TmFtZS5nZXROYW1lKCkpOwkvLyBHZXQgcmlkIG9mIGl0IHNpbmNlIGZvdW5kLgotCQkJZWxzZSB7Ci0JCQkJaWYgKCF3cm90ZUFueSkgewotCQkJCQl3cm90ZUFueSA9IHRydWU7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTmFtZXMgaW4gbGlzdCB0aGF0IGFyZSBuZXcgZm9yICIgKyBpZCArICc6Jyk7Ci0JCQkJfQotCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAgIik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3ROYW1lLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHdyb3RlQW55KQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFbmQgb2YgbmV3IG5hbWVzLiIpOwotCQkKLQkJaWYgKCF3b3JraW5nQWdhaW5zdC5pc0VtcHR5KCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTmFtZXMgdGhhdCBzaG91bGQgb2YgYmVlbiBmb3VuZCwgYnV0IHdlcmVuJ3QgZm9yICIgKyBpZCArICc6Jyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHdvcmtpbmdBZ2FpbnN0Lml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpdHIubmV4dCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAgIik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG5hbWUpOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFbmQgb2YgbWlzc2luZyBuYW1lcyIpOwotCQkJZmFpbCgiTWlzc2luZyBzb21lIHJlcXVpcmVkIG5hbWVzIGZvciAiK2lkKycuJyk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBXcml0ZSB0aGUgbmFtZXMgb3V0LiBDYWxsIG9ubHkgd2hlbiB3YW50IHRvIHVwZGF0ZSBsaXN0LiBGaWxlbmFtZSBtdXN0Ci0JICogYmUgYSBsb2NhbCBmaWxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlTmFtZXMoU3RyaW5nIGZpbGVuYW1lLCBMaXN0IHByb3BzLCBTZXQgZXhjbHVkaW5nKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJUHJpbnRXcml0ZXIgcHIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpKTsKLQkJdHJ5IHsKLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gcHJvcHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQgPSAoRU5hbWVkRWxlbWVudCkgaXRyLm5leHQoKTsKLQkJCQlpZiAoZXhjbHVkaW5nICE9IG51bGwgJiYgZXhjbHVkaW5nLmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJCQljb250aW51ZTsKLQkJCQlwci5wcmludGxuKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXByLmNsb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVmbGVjdCB0aGUgZW50aXJlIHN1cGVyIHR5cGUgaGllcmFyY2h5IG9mIHRoZSBjbGFzcyBwYXNzZWQgaW4sIGluY2x1ZGluZyB0aGUgY2xhc3MgaXRzZWxmLgotCSAqIEBwYXJhbSBqY2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0SGllcmFjaHkoSmF2YUNsYXNzIGpjbGFzcykgewotCQlKYXZhQ2xhc3MgbG9vcENsYXNzID0gamNsYXNzOwotCQl3aGlsZSAobG9vcENsYXNzICE9IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVmbGVjdGluZyBmb3IgIiArIGxvb3BDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQlsb29wQ2xhc3MuaXNGaW5hbCgpOyAvLyBUaGlzIGNhdXNlcyByZWZsZWN0aW9uLgotCQkJbG9vcENsYXNzID0gbG9vcENsYXNzLmdldFN1cGVydHlwZSgpOwotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogVXNlIHdoZW4gdGhlIGNvbXBhcmVzIGRvbid0IG1hdGNoIHRvIGdldCBhIHNvcnRlZCBsaXN0IG9mIG9wZXJhdGlvbnMgc28gdGhhdAotCSAqIG1hbnVhbGx5IHZlcmlmeSB0aGUgY291bnQuCi0JICogQHBhcmFtIGpjbGFzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dTb3J0ZWRPcGVyYXRpb25zKEphdmFDbGFzcyBqY2xhc3MpIHsKLQkJCSBMaXN0IGFsbEIgPSBqY2xhc3MuZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJCSBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbYWxsQi5zaXplKCldOwotCQkJIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkgbmFtZXNbaV0gPSAoKE1ldGhvZFByb3h5KSBhbGxCLmdldChpKSkuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpOwotCQkJIH0KLQkJCSBBcnJheXMuc29ydChuYW1lcyk7Ci0JCQkgU3lzdGVtLm91dC5wcmludGxuKCItLS0gTGlzdCBvZiBPcGVyYXRpb25zIGZvciAiICsgamNsYXNzLnRvU3RyaW5nKCkpOwotCQkJIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkgU3lzdGVtLm91dC5wcmludGxuKG5hbWVzW2ldKTsKLQkJCSB9CQkKLQl9Ci0JCi0JLyoqCi0JICogVXNlIHdoZW4gdGhlIGNvbXBhcmVzIGRvbid0IG1hdGNoIHRvIGdldCBhIHNvcnRlZCBsaXN0IG9mIHByb3BlcnRpZXMgc28gdGhhdAotCSAqIG1hbnVhbGx5IHZlcmlmeSB0aGUgY291bnQuCi0JICogQHBhcmFtIGpjbGFzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dTb3J0ZWRQcm9wZXJ0aWVzKEphdmFDbGFzcyBqY2xhc3MpIHsKLQkJTGlzdCBhbGxQID0gamNsYXNzLmdldEFsbFByb3BlcnRpZXMoKTsKLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2FsbFAuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJbmFtZXNbaV0gPSAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgYWxsUC5nZXQoaSkpLmdldE5hbWUoKTsKLQkJfQotCQlBcnJheXMuc29ydChuYW1lcyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tIExpc3Qgb2YgcHJvcGVydGllcyBmb3IgIiArIGpjbGFzcy50b1N0cmluZygpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG5hbWVzW2ldKTsKLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0QnV0dG9uKCkgewotCQlyZXR1cm4gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L2phdmEuYXd0I0J1dHRvbiIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0SkxhYmVsKCkgewotCQlyZXR1cm4gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L2phdmF4LnN3aW5nI0pMYWJlbCIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxKYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvYmpGZWF0dXJlc1NldHVwKCk7Ci0JCQotCQkvLyBUaGlzIHRlc3RzIGdldHRpbmcgYmVhbmluZm8gb3V0IG9mIGphci4gVGhlIGphciBpcyB3aXRoaW4gdGhlIHByb2plY3QuIEl0IGNvbnRhaW5zIEJ1dHRvbkJlYW5JbmZvLgotCQlKYXZhQ2xhc3MgYnV0dG9uID0gZ2V0QnV0dG9uKCk7Ci0JCXJlZmxlY3RIaWVyYWNoeShidXR0b24pOwkvLyBGaXJzdCByZWZsZWN0IGFsbCBwYXJlbnRzIChub3QgaW50cm9zcGVjdCkuCi0JCS8vIE5vdyBjYXVzZSBpbnRyb3NwZWN0aW9uLgotCQkKLQkJLy8gVG8gd3JpdGUgb3V0IHRoZSBuYW1lcyBpZiB3YW50IG5ldyBzZXQuCi0vLwkJd3JpdGVOYW1lcygiZDovdGVtcC9leHRqYXJwcm9wcy50eHQiLCBidXR0b24uZ2V0QWxsUHJvcGVydGllcygpLCBvYmpGZWF0dXJlc1NldCk7CQkKLQkJCi0JCVNldCBuYW1lcyA9IGdldE5hbWVzKCJ0ZXN0ZGF0YS9leHRqYXJwcm9wcy50eHQiKTsKLQkJdGVzdEluY2x1ZGVzQWxsTmFtZXMoIkJ1dHRvbiIsIGJ1dHRvbi5nZXRBbGxQcm9wZXJ0aWVzKCksIG5hbWVzLCBvYmpGZWF0dXJlc1NldCk7Ci0KLQkJLy8gVG8gd3JpdGUgb3V0IHRoZSBuYW1lcyBpZiB3YW50IG5ldyBzZXQuCi0vLwkJd3JpdGVOYW1lcygiZDovdGVtcC9leHRqYXJvcHMudHh0IiwgYnV0dG9uLmdldEVPcGVyYXRpb25zKCksIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7CQkKLQkJCi0JCW5hbWVzID0gZ2V0TmFtZXMoInRlc3RkYXRhL2V4dGphcm9wcy50eHQiKTsKLQkJdGVzdEluY2x1ZGVzQWxsTmFtZXMoIkJ1dHRvbiIsIGJ1dHRvbi5nZXRFT3BlcmF0aW9ucygpLCBuYW1lcywgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKLQkJCi0vLwkJc2hvd1NvcnRlZFByb3BlcnRpZXMoYnV0dG9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpMYWJlbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW9iakZlYXR1cmVzU2V0dXAoKTsKLQkJCi0JCS8vIFRoaXMgdGVzdHMgSkxhYmVsIGJlYW5pbmZvIG91dCBvZiBjdXJyZW50IHByb2plY3QsIGJ1dCB0aHJvdWdoIHNlYXJjaCBwYXRoLgotCQlKYXZhQ2xhc3MgamxhYmVsID0gZ2V0SkxhYmVsKCk7Ci0JCXJlZmxlY3RIaWVyYWNoeShqbGFiZWwpOwkvLyBGaXJzdCByZWZsZWN0IGFsbCBwYXJlbnRzIChub3QgaW50cm9zcGVjdCkuCi0JCS8vIE5vdyBjYXVzZSBpbnRyb3NwZWN0aW9uLgotCQotCQkvLyBUbyB3cml0ZSBvdXQgdGhlIG5hbWVzIGlmIHdhbnQgbmV3IHNldC4KLS8vCQl3cml0ZU5hbWVzKCJkOi90ZW1wL2psYWJlbHByb3BzLnR4dCIsIGpsYWJlbC5nZXRBbGxQcm9wZXJ0aWVzKCksIG9iakZlYXR1cmVzU2V0KTsKLQkJCi0JCVNldCBuYW1lcyA9IGdldE5hbWVzKCJ0ZXN0ZGF0YS9qbGFiZWxwcm9wcy50eHQiKTsKLQkJdGVzdEluY2x1ZGVzQWxsTmFtZXMoIkpMYWJlbCIsIGpsYWJlbC5nZXRBbGxQcm9wZXJ0aWVzKCksIG5hbWVzLCBvYmpGZWF0dXJlc1NldCk7Ci0JCQotCQkvLyBUbyB3cml0ZSBvdXQgdGhlIG5hbWVzIGlmIHdhbnQgbmV3IHNldC4KLS8vCQl3cml0ZU5hbWVzKCJkOi90ZW1wL2psYWJlbG9wcy50eHQiLCBqbGFiZWwuZ2V0RUFsbE9wZXJhdGlvbnMoKSwgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsJCQotCi0JCW5hbWVzID0gZ2V0TmFtZXMoInRlc3RkYXRhL2psYWJlbG9wcy50eHQiKTsKLQkJdGVzdEluY2x1ZGVzQWxsTmFtZXMoIkpMYWJlbCIsIGpsYWJlbC5nZXRFQWxsT3BlcmF0aW9ucygpLCBuYW1lcywgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKLQkJCi0vLwkJc2hvd1NvcnRlZFByb3BlcnRpZXMoamxhYmVsKTsKLS8vCQlzaG93U29ydGVkT3BlcmF0aW9ucyhqbGFiZWwpOwotCQkKLQkJLy8gVGVzdCB0aGF0IGlzUHJlZmVycmVkIHdvcmtzIGJvdGggZm9yIDEuMyBKVk0gYW5kIDEuNCBhbmQgbGF0ZXIgc2luY2UgdGhlcmUgd2FzIGEgYnVnIGluIDEuMy4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVuYWJsZWRTRiA9IGpsYWJlbC5nZXRFU3RydWN0dXJhbEZlYXR1cmUoImVuYWJsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihlbmFibGVkU0YpOwotCQlhc3NlcnRUcnVlKHBkLmlzUHJlZmVycmVkKCkpOwotCX0KLQkKLQkvKgotCSAqIEF0IHRpbWUgb2YgdGhpcyB0ZXN0IGNyZWF0aW9uLCB0aGlzIGlzIHRoZSBzb3J0ZWQgbGlzdHMgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMuCi0JICogCi0JCS0tLSBMaXN0IG9mIHByb3BlcnRpZXMgZm9yIGphdmEuYXd0LkJ1dHRvbgotCQlhY3Rpb25Db21tYW5kCi0JCWFsaWdubWVudFgKLQkJYWxpZ25tZW50WQotCQliYWNrZ3JvdW5kCi0JCWJvdW5kcwotCQljbGFzcwotCQljb2xvck1vZGVsCi0JCWNvbXBvbmVudE9yaWVudGF0aW9uCi0JCWN1cnNvcgotCQllbmFibGVkCi0JCWV2ZW50cwotCQlmb2N1c1RyYXZlcnNhYmxlCi0JCWZvbnQKLQkJZm9yZWdyb3VuZAotCQlncmFwaGljcwotCQlpbXBsaWNpdAotCQlpbml0aWFsaXphdGlvblN0cmluZwotCQlpbnN0YW50aWF0ZVVzaW5nCi0JCWxhYmVsCi0JCWxvY2FsZQotCQlsb2NhdGlvbgotCQlsb2NhdGlvbk9uU2NyZWVuCi0JCW1heGltdW1TaXplCi0JCW1pbmltdW1TaXplCi0JCW5hbWUKLQkJcGFyZW50Ci0JCXByZWZlcnJlZFNpemUKLQkJc2VyaWFsaXplRGF0YQotCQlzaG93aW5nCi0JCXNpemUKLQkJdG9vbGtpdAotCQl0cmVlTG9jawotCQl2YWxpZAotCQl2aXNpYmxlCi0JCQotCQktLS0gTGlzdCBvZiBwcm9wZXJ0aWVzIGZvciBqYXZheC5zd2luZy5KTGFiZWwKLQkJYWxpZ25tZW50WAotCQlhbGlnbm1lbnRZCi0JCWF1dG9zY3JvbGxzCi0JCWJhY2tncm91bmQKLQkJYm9yZGVyCi0JCWJvdW5kcwotCQljbGFzcwotCQljb2xvck1vZGVsCi0JCWNvbXBvbmVudENvdW50Ci0JCWNvbXBvbmVudE9yaWVudGF0aW9uCi0JCWNvbXBvbmVudHMKLQkJY3Vyc29yCi0JCWRlYnVnR3JhcGhpY3NPcHRpb25zCi0JCWRpc2FibGVkSWNvbgotCQlkaXNwbGF5ZWRNbmVtb25pYwotCQlkb3VibGVCdWZmZXJlZAotCQllbmFibGVkCi0JCWV2ZW50cwotCQlmb2N1c0N5Y2xlUm9vdAotCQlmb2N1c1RyYXZlcnNhYmxlCi0JCWZvbnQKLQkJZm9yZWdyb3VuZAotCQlncmFwaGljcwotCQloZWlnaHQKLQkJaG9yaXpvbnRhbEFsaWdubWVudAotCQlob3Jpem9udGFsVGV4dFBvc2l0aW9uCi0JCWljb24KLQkJaWNvblRleHRHYXAKLQkJaW1wbGljaXQKLQkJaW5pdGlhbGl6YXRpb25TdHJpbmcKLQkJaW5zZXRzCi0JCWluc3RhbnRpYXRlVXNpbmcKLQkJbGFiZWxGb3IKLQkJbGF5b3V0Ci0JCWxvY2FsZQotCQlsb2NhdGlvbgotCQlsb2NhdGlvbk9uU2NyZWVuCi0JCW1hbmFnaW5nRm9jdXMKLQkJbWF4aW11bVNpemUKLQkJbWluaW11bVNpemUKLQkJbmFtZQotCQluZXh0Rm9jdXNhYmxlQ29tcG9uZW50Ci0JCW9wYXF1ZQotCQlvcHRpbWl6ZWREcmF3aW5nRW5hYmxlZAotCQlwYWludGluZ1RpbGUKLQkJcGFyZW50Ci0JCXByZWZlcnJlZFNpemUKLQkJcmVnaXN0ZXJlZEtleVN0cm9rZXMKLQkJcmVxdWVzdEZvY3VzRW5hYmxlZAotCQlyb290UGFuZQotCQlzZXJpYWxpemVEYXRhCi0JCXNob3dpbmcKLQkJc2l6ZQotCQl0ZXh0Ci0JCXRvb2xUaXBUZXh0Ci0JCXRvb2xraXQKLQkJdG9wTGV2ZWxBbmNlc3RvcgotCQl0cmVlTG9jawotCQl2YWxpZAotCQl2YWxpZGF0ZVJvb3QKLQkJdmVydGljYWxBbGlnbm1lbnQKLQkJdmVydGljYWxUZXh0UG9zaXRpb24KLQkJdmlzaWJsZQotCQl2aXNpYmxlUmVjdAotCQl3aWR0aAotCQl4Ci0JCXkKLQkKLQkJLS0tIExpc3Qgb2YgT3BlcmF0aW9ucyBmb3IgamF2YXguc3dpbmcuSkxhYmVsCi0JCWFkZChqYXZhLmF3dC5Db21wb25lbnQpCi0JCWFkZChqYXZhLmF3dC5Db21wb25lbnQsaW50KQotCQlhZGQoamF2YS5hd3QuQ29tcG9uZW50LGphdmEubGFuZy5PYmplY3QpCi0JCWFkZChqYXZhLmF3dC5Db21wb25lbnQsamF2YS5sYW5nLk9iamVjdCxpbnQpCi0JCWFkZChqYXZhLmF3dC5Qb3B1cE1lbnUpCi0JCWFkZChqYXZhLmxhbmcuU3RyaW5nLGphdmEuYXd0LkNvbXBvbmVudCkKLQkJYWRkTm90aWZ5KCkKLQkJY2hlY2tJbWFnZShqYXZhLmF3dC5JbWFnZSxqYXZhLmF3dC5pbWFnZS5JbWFnZU9ic2VydmVyKQotCQljb21wdXRlVmlzaWJsZVJlY3QoamF2YS5hd3QuUmVjdGFuZ2xlKQotCQljb250YWlucyhpbnQsaW50KQotCQljb250YWlucyhqYXZhLmF3dC5Qb2ludCkKLQkJY3JlYXRlSW1hZ2UoaW50LGludCkKLQkJY3JlYXRlSW1hZ2UoamF2YS5hd3QuaW1hZ2UuSW1hZ2VQcm9kdWNlcikKLQkJY3JlYXRlVG9vbFRpcCgpCi0JCWRpc3BhdGNoRXZlbnQoamF2YS5hd3QuQVdURXZlbnQpCi0JCWRvTGF5b3V0KCkKLQkJZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZShqYXZhLmxhbmcuU3RyaW5nLGJvb2xlYW4sYm9vbGVhbikKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKGphdmEubGFuZy5TdHJpbmcsY2hhcixjaGFyKQotCQlmaXJlUHJvcGVydHlDaGFuZ2UoamF2YS5sYW5nLlN0cmluZyxkb3VibGUsZG91YmxlKQotCQlmaXJlUHJvcGVydHlDaGFuZ2UoamF2YS5sYW5nLlN0cmluZyxmbG9hdCxmbG9hdCkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKGphdmEubGFuZy5TdHJpbmcsaW50LGludCkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKGphdmEubGFuZy5TdHJpbmcsbG9uZyxsb25nKQotCQlmaXJlUHJvcGVydHlDaGFuZ2UoamF2YS5sYW5nLlN0cmluZyxzaG9ydCxzaG9ydCkKLQkJZ2V0QWNjZXNzaWJsZUNvbnRleHQoKQotCQlnZXRBY3Rpb25Gb3JLZXlTdHJva2UoamF2YXguc3dpbmcuS2V5U3Ryb2tlKQotCQlnZXRBbGlnbm1lbnRYKCkKLQkJZ2V0QWxpZ25tZW50WSgpCi0JCWdldEF1dG9zY3JvbGxzKCkKLQkJZ2V0QmFja2dyb3VuZCgpCi0JCWdldEJvcmRlcigpCi0JCWdldEJvdW5kcygpCi0JCWdldEJvdW5kcyhqYXZhLmF3dC5SZWN0YW5nbGUpCi0JCWdldENsYXNzKCkKLQkJZ2V0Q2xpZW50UHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCkKLQkJZ2V0Q29sb3JNb2RlbCgpCi0JCWdldENvbXBvbmVudChpbnQpCi0JCWdldENvbXBvbmVudEF0KGludCxpbnQpCi0JCWdldENvbXBvbmVudEF0KGphdmEuYXd0LlBvaW50KQotCQlnZXRDb21wb25lbnRDb3VudCgpCi0JCWdldENvbXBvbmVudHMoKQotCQlnZXRDb25kaXRpb25Gb3JLZXlTdHJva2UoamF2YXguc3dpbmcuS2V5U3Ryb2tlKQotCQlnZXRDdXJzb3IoKQotCQlnZXREaXNhYmxlZEljb24oKQotCQlnZXREaXNwbGF5ZWRNbmVtb25pYygpCi0JCWdldEZvbnQoKQotCQlnZXRGb250TWV0cmljcyhqYXZhLmF3dC5Gb250KQotCQlnZXRGb3JlZ3JvdW5kKCkKLQkJZ2V0R3JhcGhpY3MoKQotCQlnZXRIZWlnaHQoKQotCQlnZXRIb3Jpem9udGFsQWxpZ25tZW50KCkKLQkJZ2V0SG9yaXpvbnRhbFRleHRQb3NpdGlvbigpCi0JCWdldEljb24oKQotCQlnZXRJY29uVGV4dEdhcCgpCi0JCWdldEluc2V0cygpCi0JCWdldExhYmVsRm9yKCkKLQkJZ2V0TGF5b3V0KCkKLQkJZ2V0TG9jYWxlKCkKLQkJZ2V0TG9jYXRpb24oKQotCQlnZXRMb2NhdGlvbihqYXZhLmF3dC5Qb2ludCkKLQkJZ2V0TG9jYXRpb25PblNjcmVlbigpCi0JCWdldE1heGltdW1TaXplKCkKLQkJZ2V0TWluaW11bVNpemUoKQotCQlnZXROYW1lKCkKLQkJZ2V0TmV4dEZvY3VzYWJsZUNvbXBvbmVudCgpCi0JCWdldFBhcmVudCgpCi0JCWdldFByZWZlcnJlZFNpemUoKQotCQlnZXRSZWdpc3RlcmVkS2V5U3Ryb2tlcygpCi0JCWdldFJvb3RQYW5lKCkKLQkJZ2V0U2l6ZSgpCi0JCWdldFNpemUoamF2YS5hd3QuRGltZW5zaW9uKQotCQlnZXRUZXh0KCkKLQkJZ2V0VG9vbFRpcFRleHQoKQotCQlnZXRUb29sa2l0KCkKLQkJZ2V0VG9wTGV2ZWxBbmNlc3RvcigpCi0JCWdldFRyZWVMb2NrKCkKLQkJZ2V0VUkoKQotCQlnZXRWZXJ0aWNhbEFsaWdubWVudCgpCi0JCWdldFZlcnRpY2FsVGV4dFBvc2l0aW9uKCkKLQkJZ2V0VmlzaWJsZVJlY3QoKQotCQlnZXRXaWR0aCgpCi0JCWdldFgoKQotCQlnZXRZKCkKLQkJZ3JhYkZvY3VzKCkKLQkJaGFzRm9jdXMoKQotCQloYXNoQ29kZSgpCi0JCWludmFsaWRhdGUoKQotCQlpc0FuY2VzdG9yT2YoamF2YS5hd3QuQ29tcG9uZW50KQotCQlpc0RvdWJsZUJ1ZmZlcmVkKCkKLQkJaXNFbmFibGVkKCkKLQkJaXNGb2N1c0N5Y2xlUm9vdCgpCi0JCWlzRm9jdXNUcmF2ZXJzYWJsZSgpCi0JCWlzTWFuYWdpbmdGb2N1cygpCi0JCWlzT3BhcXVlKCkKLQkJaXNPcHRpbWl6ZWREcmF3aW5nRW5hYmxlZCgpCi0JCWlzUmVxdWVzdEZvY3VzRW5hYmxlZCgpCi0JCWlzU2hvd2luZygpCi0JCWlzVmFsaWQoKQotCQlpc1ZhbGlkYXRlUm9vdCgpCi0JCWlzVmlzaWJsZSgpCi0JCWxpc3QoKQotCQlsaXN0KGphdmEuaW8uUHJpbnRTdHJlYW0pCi0JCWxpc3QoamF2YS5pby5QcmludFN0cmVhbSxpbnQpCi0JCWxpc3QoamF2YS5pby5QcmludFdyaXRlcixpbnQpCi0JCW5vdGlmeSgpCi0JCW5vdGlmeUFsbCgpCi0JCXBhaW50KGphdmEuYXd0LkdyYXBoaWNzKQotCQlwYWludEFsbChqYXZhLmF3dC5HcmFwaGljcykKLQkJcGFpbnRJbW1lZGlhdGVseShqYXZhLmF3dC5SZWN0YW5nbGUpCi0JCXByZXBhcmVJbWFnZShqYXZhLmF3dC5JbWFnZSxqYXZhLmF3dC5pbWFnZS5JbWFnZU9ic2VydmVyKQotCQlwcmludChqYXZhLmF3dC5HcmFwaGljcykKLQkJcHJpbnRBbGwoamF2YS5hd3QuR3JhcGhpY3MpCi0JCXB1dENsaWVudFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsamF2YS5sYW5nLk9iamVjdCkKLQkJcmVtb3ZlKGludCkKLQkJcmVtb3ZlKGphdmEuYXd0LkNvbXBvbmVudCkKLQkJcmVtb3ZlKGphdmEuYXd0Lk1lbnVDb21wb25lbnQpCi0JCXJlbW92ZUFsbCgpCi0JCXJlbW92ZU5vdGlmeSgpCi0JCXJlcGFpbnQoKQotCQlyZXBhaW50KGphdmEuYXd0LlJlY3RhbmdsZSkKLQkJcmVxdWVzdERlZmF1bHRGb2N1cygpCi0JCXJlcXVlc3RGb2N1cygpCi0JCXJlc2V0S2V5Ym9hcmRBY3Rpb25zKCkKLQkJcmV2YWxpZGF0ZSgpCi0JCXNjcm9sbFJlY3RUb1Zpc2libGUoamF2YS5hd3QuUmVjdGFuZ2xlKQotCQlzZXRBbGlnbm1lbnRYKGZsb2F0KQotCQlzZXRBbGlnbm1lbnRZKGZsb2F0KQotCQlzZXRBdXRvc2Nyb2xscyhib29sZWFuKQotCQlzZXRCYWNrZ3JvdW5kKGphdmEuYXd0LkNvbG9yKQotCQlzZXRCb3JkZXIoamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcikKLQkJc2V0Qm91bmRzKGludCxpbnQsaW50LGludCkKLQkJc2V0Qm91bmRzKGphdmEuYXd0LlJlY3RhbmdsZSkKLQkJc2V0Q3Vyc29yKGphdmEuYXd0LkN1cnNvcikKLQkJc2V0RGVidWdHcmFwaGljc09wdGlvbnMoaW50KQotCQlzZXREaXNhYmxlZEljb24oamF2YXguc3dpbmcuSWNvbikKLQkJc2V0RGlzcGxheWVkTW5lbW9uaWMoY2hhcikKLQkJc2V0RG91YmxlQnVmZmVyZWQoYm9vbGVhbikKLQkJc2V0RW5hYmxlZChib29sZWFuKQotCQlzZXRGb250KGphdmEuYXd0LkZvbnQpCi0JCXNldEZvcmVncm91bmQoamF2YS5hd3QuQ29sb3IpCi0JCXNldEhvcml6b250YWxBbGlnbm1lbnQoaW50KQotCQlzZXRIb3Jpem9udGFsVGV4dFBvc2l0aW9uKGludCkKLQkJc2V0SWNvbihqYXZheC5zd2luZy5JY29uKQotCQlzZXRJY29uVGV4dEdhcChpbnQpCi0JCXNldExhYmVsRm9yKGphdmEuYXd0LkNvbXBvbmVudCkKLQkJc2V0TGF5b3V0KGphdmEuYXd0LkxheW91dE1hbmFnZXIpCi0JCXNldExvY2FsZShqYXZhLnV0aWwuTG9jYWxlKQotCQlzZXRMb2NhdGlvbihpbnQsaW50KQotCQlzZXRMb2NhdGlvbihqYXZhLmF3dC5Qb2ludCkKLQkJc2V0TWF4aW11bVNpemUoamF2YS5hd3QuRGltZW5zaW9uKQotCQlzZXRNaW5pbXVtU2l6ZShqYXZhLmF3dC5EaW1lbnNpb24pCi0JCXNldE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkJc2V0TmV4dEZvY3VzYWJsZUNvbXBvbmVudChqYXZhLmF3dC5Db21wb25lbnQpCi0JCXNldE9wYXF1ZShib29sZWFuKQotCQlzZXRQcmVmZXJyZWRTaXplKGphdmEuYXd0LkRpbWVuc2lvbikKLQkJc2V0UmVxdWVzdEZvY3VzRW5hYmxlZChib29sZWFuKQotCQlzZXRTaXplKGludCxpbnQpCi0JCXNldFNpemUoamF2YS5hd3QuRGltZW5zaW9uKQotCQlzZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpCi0JCXNldFRvb2xUaXBUZXh0KGphdmEubGFuZy5TdHJpbmcpCi0JCXNldFVJKGphdmF4LnN3aW5nLnBsYWYuTGFiZWxVSSkKLQkJc2V0VmVydGljYWxBbGlnbm1lbnQoaW50KQotCQlzZXRWZXJ0aWNhbFRleHRQb3NpdGlvbihpbnQpCi0JCXNldFZpc2libGUoYm9vbGVhbikKLQkJdG9TdHJpbmcoKQotCQl0cmFuc2ZlckZvY3VzKCkKLQkJdW5yZWdpc3RlcktleWJvYXJkQWN0aW9uKGphdmF4LnN3aW5nLktleVN0cm9rZSkKLQkJdXBkYXRlKGphdmEuYXd0LkdyYXBoaWNzKQotCQl1cGRhdGVVSSgpCi0JCXZhbGlkYXRlKCkKLQkJd2FpdCgpCi0JCXdhaXQobG9uZykKLQkJd2FpdChsb25nLGludCkKLQkJCQotCSAqLwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0UmVmbGVjdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdFJlZmxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxMTE4My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0UmVmbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvOwotLyoKLSAqICAkUkNTZmlsZTogVGVzdFJlZmxlY3Rpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDcvMDMvMjggMDI6NDM6NDUgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5UeXBlS2luZDsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKiBUaGlzIG9uZSBpcyBmb3IgdGVzdGluZyByZWZsZWN0aW9uLiBJdCBpcyBzZXBhcmF0ZSBzbyB0aGF0Ci0gKiB0ZXN0IHN1aXRlIGNhbiBndWFyZW50ZWUgdGhhdCBpdCBpcyBmaXJzdC4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RSZWZsZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlIHsKLQotCXB1YmxpYyBUZXN0UmVmbGVjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdFJlZmxlY3Rpb24oU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZWZsZWN0aW9uKCkgewotCQkvLyBUZXN0IG9uZSB3aXRob3V0IGEgYmVhbmluZm8uIFRoaXMgd2lsbCBkbyByZWZsZWN0aW9uLgotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9Ci0JCQkoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QxQ2xhc3MiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWFzc2VydFNhbWUoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgdGVzdDFDbGFzcy5nZXRLaW5kKCkpOwotCQkKLQkJLy8gVGVzdCB0aGF0IHRoZSByZWZsZWN0aW9uIGtleSBjYW4gZmluZCBmZWF0dXJlcyB0aGF0IGFyZW4ndCB5ZXQgbG9hZGVkLgotCQlPYmplY3QgZm9vID0gcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzL2ZvbyIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGZvbyk7Ci0JCQotCQkvLyBUZXN0IHRoYXQgdGhlIHJlZmxlY3Rpb24ga2V5IGNhbiBmaW5kIG9wZXJhdGlvbnMgdGhhdCBhcmVuJ3QgeWV0IGxvYWRlZC4KLQkJT2JqZWN0IGdldEZvbyA9Ci0JCQlyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QxQ2xhc3Mvb3BlcmF0aW9uL2dldEZvbyIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGdldEZvbyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyUmVmbGVjdGlvbkluRGVmYXVsdCgpIHsKLQkJLy8gVGVzdCB0aGF0IGEgcHJvcGVydHkgb2YgY2xhc3MgKHRocm91Z2ggcmVmbGVjdGlvbikgaXMgYW4gaW5uZXIgY2xhc3MsIGFuZCB0aGUgY2xhc3MgaXMgcmVzb2x2ZWQgY29ycmVjdGx5LgotCQlKYXZhQ2xhc3MgdGVzdElubmVyQ2xhc3MgPQotCQkJKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6LyNUZXN0RGVmYXVsdElubmVyIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwsIHRlc3RJbm5lckNsYXNzLmdldEtpbmQoKSk7Ci0JCQotCQlFTGlzdCBwcm9wZXJ0aWVzID0gdGVzdElubmVyQ2xhc3MuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgcHJvcGVydGllcy5zaXplKCkpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygicHJvcGVydHlJbm5lciIsIHBmLmdldE5hbWUoKSk7Ci0JCQotCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihwZik7Ci0JCWFzc2VydE5vdE51bGwocGQpOwotCQkKLQkJSmF2YUNsYXNzIHBkVHlwZSA9IChKYXZhQ2xhc3MpIHBkLmdldFByb3BlcnR5VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3REZWZhdWx0SW5uZXIkSW5uZXIiLCBwZFR5cGUuZ2V0TmFtZSgpKTsgCi0JCWFzc2VydFNhbWUoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgcGRUeXBlLmdldEtpbmQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlZmxlY3Rpb25JblBhY2thZ2UoKSB7Ci0JCS8vIFRlc3QgdGhhdCBhIHByb3BlcnR5IG9mIGNsYXNzICh0aHJvdWdoIHJlZmxlY3Rpb24pIGlzIGFuIGlubmVyIGNsYXNzLCBhbmQgdGhlIGNsYXNzIGlzIHJlc29sdmVkIGNvcnJlY3RseS4KLQkJSmF2YUNsYXNzIHRlc3RJbm5lckNsYXNzID0KLQkJCShKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdElubmVyIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwsIHRlc3RJbm5lckNsYXNzLmdldEtpbmQoKSk7Ci0JCQotCQlFTGlzdCBwcm9wZXJ0aWVzID0gdGVzdElubmVyQ2xhc3MuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgcHJvcGVydGllcy5zaXplKCkpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygicHJvcGVydHlJbm5lciIsIHBmLmdldE5hbWUoKSk7Ci0JCQotCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihwZik7Ci0JCWFzc2VydE5vdE51bGwocGQpOwotCQkKLQkJSmF2YUNsYXNzIHBkVHlwZSA9IChKYXZhQ2xhc3MpIHBkLmdldFByb3BlcnR5VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RJbm5lciRJbm5lciIsIHBkVHlwZS5nZXROYW1lKCkpOyAKLQkJYXNzZXJ0U2FtZShUeXBlS2luZC5DTEFTU19MSVRFUkFMLCBwZFR5cGUuZ2V0S2luZCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldFJlYWxQcm9wcyhMaXN0IHByb3BzKSB7Ci0JCWludCBzaXplID0gcHJvcHMuc2l6ZSgpOwotCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BzLmdldChpKTsKLQkJCWlmIChVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IoZikgIT0gbnVsbCkKLQkJCQluZXdMaXN0LmFkZChmKTsKLQkJfQotCQlyZXR1cm4gbmV3TGlzdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEludGVyZmFjZVByb3BlcnR5UmVmbGVjdGlvbigpIHsKLQkJLy8gVGVzdCB0aGUgcmVmbGVjdGlvbiBvZiBpbnRlcmZhY2VzIHdpdGggbXVsdGlwbGUgZXh0ZW5kcyBvbiB0aGVtIHNvIHRoYXQgcHJvcGVyaXRpZXMgYXJlIGNvcnJlY3QuCi0JCUphdmFDbGFzcyB0ZXN0UHJvcENsYXNzID0KLQkJCShKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8udGVzdCNOb3RUb3BHdXkiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKHRlc3RQcm9wQ2xhc3MuaXNJbnRlcmZhY2UoKSk7Ci0JCQotCQkvLyBUZXN0IHRoYXQgd2UgZG9uJ3QgcGljayB1cCB0aGUgZXh0ZW5kcyBzdHVmZgotCQlMaXN0IHByb3BzID0gZ2V0UmVhbFByb3BzKHRlc3RQcm9wQ2xhc3MuZ2V0UHJvcGVydGllcygpKTsKLQkJLy8gRm9yZ290IHRoZXJlIG1heSBiZSBub24tcHJvcGVydGllcyBwcm9wZXJ0aWVzLgotCQlhc3NlcnRFcXVhbHMoMSwgcHJvcHMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJudW1iZXIiLCAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcHMuZ2V0KDApKS5nZXROYW1lKCkpOwotCQkKLQkJLy8gVGVzdCB0aGF0IHdlIHBpY2sgdXAgdGhlIGV4dGVuZHMgc3R1ZmYKLQkJcHJvcHMgPSBnZXRSZWFsUHJvcHModGVzdFByb3BDbGFzcy5nZXRBbGxQcm9wZXJ0aWVzKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgcHJvcHMuc2l6ZSgpKTsKLQkJTGlzdCB2YWxpZE5hbWVzID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyJudW1iZXIiLCAib2JqZWN0IiwgImludGVnZXIifSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gcHJvcHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRyLm5leHQoKTsKLQkJCWFzc2VydFRydWUoIkV4dHJhIGZlYXR1cmU6IitmZWF0dXJlLmdldE5hbWUoKSwgdmFsaWROYW1lcy5jb250YWlucyhmZWF0dXJlLmdldE5hbWUoKSkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VFdmVudFJlZmxlY3Rpb24oKSB7Ci0JCS8vIFRlc3QgdGhlIHJlZmxlY3Rpb24gb2YgaW50ZXJmYWNlcyB3aXRoIG11bHRpcGxlIGV4dGVuZHMgb24gdGhlbSBzbyB0aGF0IGV2ZW50cyBhcmUgY29ycmVjdC4KLQkJSmF2YUNsYXNzIHRlc3RFdmVudENsYXNzID0KLQkJCShKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8udGVzdCNOb3RUb3BHdXkiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKHRlc3RFdmVudENsYXNzLmlzSW50ZXJmYWNlKCkpOwotCQkKLQkJLy8gVGVzdCB0aGF0IHdlIGRvbid0IHBpY2sgdXAgdGhlIGV4dGVuZHMgc3R1ZmYKLQkJTGlzdCBldmVudHMgPSB0ZXN0RXZlbnRDbGFzcy5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0VHJ1ZShldmVudHMuaXNFbXB0eSgpKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCB3ZSBwaWNrIHVwIHRoZSBleHRlbmRzIHN0dWZmCi0JCWV2ZW50cyA9IHRlc3RFdmVudENsYXNzLmdldEFsbEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdDFDbGFzc0V2ZW50IiwgKChKYXZhRXZlbnQpIGV2ZW50cy5nZXQoMCkpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VPcGVyYXRpb25zUmVmbGVjdGlvbigpIHsKLQkJLy8gVGVzdCB0aGUgcmVmbGVjdGlvbiBvZiBpbnRlcmZhY2VzIHdpdGggbXVsdGlwbGUgZXh0ZW5kcyBvbiB0aGVtIHNvIHRoYXQgcHJvcGVyaXRpZXMgYXJlIGNvcnJlY3QuCi0JCUphdmFDbGFzcyB0ZXN0T3BDbGFzcyA9Ci0JCQkoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLnRlc3QjTm90VG9wR3V5IiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0VHJ1ZSh0ZXN0T3BDbGFzcy5pc0ludGVyZmFjZSgpKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCB3ZSBkb24ndCBwaWNrIHVwIHRoZSBleHRlbmRzIHN0dWZmCi0JCUxpc3Qgb3BzID0gdGVzdE9wQ2xhc3MuZ2V0RU9wZXJhdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9wcy5zaXplKCkpOwotCQlMaXN0IHZhbGlkTmFtZXMgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ImdldE51bWJlciIsICJzZXROdW1iZXIifSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gb3BzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlFT3BlcmF0aW9uIG9wID0gKEVPcGVyYXRpb24pIGl0ci5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJFeHRyYSBvcGVyYXRpb246IitvcC5nZXROYW1lKCksIHZhbGlkTmFtZXMuY29udGFpbnMob3AuZ2V0TmFtZSgpKSk7Ci0JCX0KLQkJCi0JCQotCQkvLyBUZXN0IHRoYXQgd2UgcGljayB1cCB0aGUgZXh0ZW5kcyBzdHVmZgotCQlvcHMgPSB0ZXN0T3BDbGFzcy5nZXRFQWxsT3BlcmF0aW9ucygpOwotCQlhc3NlcnRFcXVhbHMoOCwgb3BzLnNpemUoKSk7Ci0JCXZhbGlkTmFtZXMgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ImdldE51bWJlciIsICJzZXROdW1iZXIiLCAiZ2V0T2JqZWN0IiwgInNldE9iamVjdCIsICJnZXRJbnRlZ2VyIiwgInNldEludGVnZXIiLCAiYWRkVGVzdDFDbGFzc0V2ZW50TGlzdGVuZXIiLCAicmVtb3ZlVGVzdDFDbGFzc0V2ZW50TGlzdGVuZXIifSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gb3BzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlFT3BlcmF0aW9uIG9wID0gKEVPcGVyYXRpb24pIGl0ci5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJFeHRyYSBvcGVyYXRpb246IitvcC5nZXROYW1lKCksIHZhbGlkTmFtZXMuY29udGFpbnMob3AuZ2V0TmFtZSgpKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBmb3IgcmVncmVzc2lvbiBmb3IgdGhpcyBidWcuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUzMTUwCi0JICoKLQkgKi8KLQkvKiBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTAyMyAtIHdlIG5lZWQgdG8gcnVuIEhFQURMRVNTIHRlc3RzIGFzIEhFQURMRVNTLCBhbmQgdGhpcyB0ZXN0IHJlcXVpcmVzIFVJCi0JcHVibGljIHZvaWQgdGVzdDE1MzE1MCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVGhpcyB0ZXN0cyB0aGF0IHdpdGhpbiBhIHBsYXRmb3JtIHJ1bm5hYmxlLCB0aGF0IGlmIGEgY2xhc3MgaXMgcmVmbGVjdGVkIGFzIG5vdCBmb3VuZCwgdGhlbiBpcyBjcmVhdGVkIGFuZCBzb3VyY2UgdHlwZSB0ZXN0ZWQgdGhhdAotCQkvLyBpdCB3aWxsIG5vdyByZWZsZWN0IGFzIGZvdW5kLiBUaGUgc291cmNlIHR5cGUgdGVzdCBmb3JjZXMgYSBmbHVzaCBpZiB0aGUgdHlwZSBpcyBub3cgZm91bmQuIEhvd2V2ZXIsIGlmIGRpZG4ndCBkbyBzb3VyY2UgdHlwZSB0ZXN0Ci0JCS8vIGJ1dCBkaWQganVzdCByZWZsZWN0aW9uIHdlIHdvdWxkbid0IHNlZSB0aGUgbmV3IGNsYXNzIHVudGlsIGFmdGVyIG5vdGlmaWNhdGlvbi4gVGhpcyBidWcgZG9lc24ndCBhZGRyZXNzIHRoYXQgcHJvYmxlbS4KLQkJCi0JCS8vIE5lZWQgdG8gaGF2ZSBhIGZvbGRlciAocGFja2FnZSkgYWxyZWFkeSBleGlzdCBmb3IgdGhpcyB0ZXN0IHRvIHdvcmsuIElmIHRoZSBwYWNrYWdlIHdhcyBjcmVhdGVkIGF0IHRoZSBzYW1lIHRpbWUKLQkJLy8gYXMgdGhlIGNsYXNzLCB0aGVuIGl0IHdvbid0IGJlIGZvdW5kIHVudGlsIGFmdGVyIHRoZSBub3RpZmljYXRpb24gaXMgZG9uZS4gQnV0IHRoaXMgZml4IHdhcyBmb3IgYSBuZXcgY2xhc3MgaW4gYW4KLQkJLy8gZXhpc3RpbmcgcGFja2FnZS4KLQkJSVBhY2thZ2VGcmFnbWVudCBwa2cxID0gKElQYWNrYWdlRnJhZ21lbnQpIEphdmFDb3JlLmNyZWF0ZShuYXR1cmUuZ2V0UHJvamVjdCgpKS5maW5kRWxlbWVudChuZXcgUGF0aCgib3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvIikpOwotCQlmaW5hbCBJRm9sZGVyIGZvbGRlciA9ICgoSUZvbGRlcikgcGtnMS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSkuZ2V0Rm9sZGVyKCJ0MTUzMTUwIik7Ci0JCWlmICghZm9sZGVyLmV4aXN0cygpKQotCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0W10gdGVzdENVID0gbmV3IElDb21waWxhdGlvblVuaXRbMV07Ci0JCXRyeSB7Ci0JCQlKYXZhQ29yZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCUphdmFDbGFzcyB0ZXN0MUNsYXNzID0KLQkJCQkJCShKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8udDE1MzE1MCNUZXN0MTUzMTUwQ2xhc3MiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgbm90IGJlIGRlZmluZWQuIiwgVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwsIHRlc3QxQ2xhc3MuZ2V0S2luZCgpKTsKLQotCQkJCQkvLyBOb3cgY3JlYXRlIHRoZSBjbGFzcy4KLQkJCQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkgSmF2YUNvcmUuY3JlYXRlKGZvbGRlcik7Ci0JCQkJCXRlc3RDVVswXSA9IHBrZy5jcmVhdGVDb21waWxhdGlvblVuaXQoIlRlc3QxNTMxNTBDbGFzcy5qYXZhIiwgInB1YmxpYyBjbGFzcyBUZXN0MTUzMTUwQ2xhc3Mge30iLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQkJCQlhc3NlcnRFcXVhbHMoIkl0IHNob3VsZCBzdGlsbCByZWZsZWN0IGFzIG5vdCBmb3VuZC4iLCBUeXBlS2luZC5VTkRFRklORURfTElURVJBTCwgdGVzdDFDbGFzcy5nZXRLaW5kKCkpOwotCQkJCQkKLQkJCQkJLy8gTm93IGRvIHRoZSBnZXQgc291cmNlIHR5cGUuIFRoaXMgc2hvdWxkIHJlc2V0IG91ciBmbGFncy4KLQkJCQkJYXNzZXJ0VHJ1ZSgiSXQgc2hvdWxkIGhhdmUgYSBzb3VyY2UgdHlwZS4iLCB0ZXN0MUNsYXNzLmlzRXhpc3RpbmdUeXBlKCkpOwotCQkJCQkKLQkJCQkJLy8gTm93IGl0IHNob3VsZCByZWZsZWN0LgotCQkJCQlhc3NlcnRFcXVhbHMoIkl0IHNob3VsZCBub3cgcmVmbGVjdCBhcyBmb3VuZC4iLCBUeXBlS2luZC5DTEFTU19MSVRFUkFMLCB0ZXN0MUNsYXNzLmdldEtpbmQoKSk7Ci0JCQkJfQotCQkJfSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodGVzdENVWzBdICE9IG51bGwpIHsKLQkJCQl0ZXN0Q1VbMF0uZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQl9Ci0JfQotCSovCi0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0U3RhbmRhcmQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3RTdGFuZGFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M5MmIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3RTdGFuZGFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm87Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0U3RhbmRhcmQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTQgJCAgJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NTYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5VdGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBTdGFuZGFyZCBCZWFuSW5mbyB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RTdGFuZGFyZCBleHRlbmRzIEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVGVzdFN0YW5kYXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUZXN0U3RhbmRhcmQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlDbGFzc1R5cGUoKSB7Ci0JCS8vIFRlc3Qgb25lIGRpbWVuc2lvbiBhcnJheSB0eXBlIGZvciBhIGNsYXNzIGFzIGZpbmFsIGNvbXBvbmVudAotCQlKYXZhQ2xhc3MgYXQgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5UZXN0MUNsYXNzW10iLCByc2V0KTsKLQkJCi0JCWFzc2VydFRydWUoYXQuaXNBcnJheSgpKTsKLQkJYXNzZXJ0U2FtZShUeXBlS2luZC5DTEFTU19MSVRFUkFMLCBhdC5nZXRLaW5kKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChBcnJheVR5cGUpIGF0KS5nZXRBcnJheURpbWVuc2lvbnMoKSk7Ci0JCWFzc2VydFRydWUoYXQuaXNQdWJsaWMoKSk7Ci0JCWFzc2VydFRydWUoImphdmEubGFuZy5PYmplY3QiLmVxdWFscyhhdC5nZXRTdXBlcnR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpLnNpemUoKSA9PSAyKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRNZXRob2RzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRGaWVsZHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEV2ZW50cygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RU9wZXJhdGlvbnMoKS5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheVByaW1pdGl2ZVR5cGUoKSB7Ci0JCS8vIFRlc3Qgb25lIGRpbWVuc2lvbiBhcnJheSB0eXBlIGZvciBhIGNsYXNzIGFzIGZpbmFsIGNvbXBvbmVudAotCQlKYXZhQ2xhc3MgYXQgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImludFtdIiwgcnNldCk7Ci0JCQotCQlhc3NlcnRUcnVlKGF0LmlzQXJyYXkoKSk7Ci0JCWFzc2VydFNhbWUoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgYXQuZ2V0S2luZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoQXJyYXlUeXBlKSBhdCkuZ2V0QXJyYXlEaW1lbnNpb25zKCkpOwkJCi0JCWFzc2VydFRydWUoYXQuaXNQdWJsaWMoKSk7Ci0JCWFzc2VydFRydWUoImphdmEubGFuZy5PYmplY3QiLmVxdWFscyhhdC5nZXRTdXBlcnR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpLnNpemUoKSA9PSAyKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRNZXRob2RzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRGaWVsZHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEV2ZW50cygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RU9wZXJhdGlvbnMoKS5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheVVuZGVmaW5lZCgpIHsKLQkJLy8gVGVzdCBvbmUgZGltZW5zaW9uIGFycmF5IHR5cGUgZm9yIGEgY2xhc3MgYXMgZmluYWwgY29tcG9uZW50IHRoYXQgaXMgdW5kZWZpbmVkLgotCQlKYXZhQ2xhc3MgYXQgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoIlhZWltdIiwgcnNldCk7Ci0JCQotCQlhc3NlcnRUcnVlKGF0LmlzQXJyYXkoKSk7Ci0JCWFzc2VydFNhbWUoVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwsIGF0LmdldEtpbmQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5Q2xhc3NUeXBlMkRpbSgpIHsKLQkJLy8gVGVzdCBvbmUgZGltZW5zaW9uIGFycmF5IHR5cGUgZm9yIGEgY2xhc3MgYXMgZmluYWwgY29tcG9uZW50Ci0JCUphdmFDbGFzcyBhdCA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLlRlc3QxQ2xhc3NbXVtdIiwgcnNldCk7Ci0JCQotCQlhc3NlcnRUcnVlKGF0LmlzQXJyYXkoKSk7Ci0JCWFzc2VydFNhbWUoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgYXQuZ2V0S2luZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsICgoQXJyYXlUeXBlKSBhdCkuZ2V0QXJyYXlEaW1lbnNpb25zKCkpOwotCQlhc3NlcnRUcnVlKGF0LmlzUHVibGljKCkpOwotCQlhc3NlcnRUcnVlKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMoYXQuZ2V0U3VwZXJ0eXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUoYXQuZ2V0TWV0aG9kcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RmllbGRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRFdmVudHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEVPcGVyYXRpb25zKCkuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlQcmltaXRpdmVUeXBlMkRpbSgpIHsKLQkJLy8gVGVzdCBvbmUgZGltZW5zaW9uIGFycmF5IHR5cGUgZm9yIGEgY2xhc3MgYXMgZmluYWwgY29tcG9uZW50Ci0JCUphdmFDbGFzcyBhdCA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiaW50W11bXSIsIHJzZXQpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhdC5pc0FycmF5KCkpOwotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwsIGF0LmdldEtpbmQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKEFycmF5VHlwZSkgYXQpLmdldEFycmF5RGltZW5zaW9ucygpKTsJCQotCQlhc3NlcnRUcnVlKGF0LmlzUHVibGljKCkpOwotCQlhc3NlcnRUcnVlKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMoYXQuZ2V0U3VwZXJ0eXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUoYXQuZ2V0TWV0aG9kcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RmllbGRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRFdmVudHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEVPcGVyYXRpb25zKCkuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlVbmRlZmluZWQyRGltKCkgewotCQkvLyBUZXN0IG9uZSBkaW1lbnNpb24gYXJyYXkgdHlwZSBmb3IgYSBjbGFzcyBhcyBmaW5hbCBjb21wb25lbnQgdGhhdCBpcyB1bmRlZmluZWQuCi0JCUphdmFDbGFzcyBhdCA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiWFlaW11bXSIsIHJzZXQpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhdC5pc0FycmF5KCkpOwotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMLCBhdC5nZXRLaW5kKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUlubmVyQ2xhc3NUeXBlKCkgewotCQkvLyBUZXN0IG9uZSBkaW1lbnNpb24gYXJyYXkgdHlwZSBmb3IgYSBjbGFzcyBhcyBmaW5hbCBjb21wb25lbnQKLQkJSmF2YUNsYXNzIGF0ID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uQ3VzdG9tZXIkQWNjb3VudFtdIiwgcnNldCk7Ci0JCQotCQlhc3NlcnRUcnVlKGF0LmlzQXJyYXkoKSk7Ci0JCWFzc2VydFNhbWUoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgYXQuZ2V0S2luZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoQXJyYXlUeXBlKSBhdCkuZ2V0QXJyYXlEaW1lbnNpb25zKCkpOwotCQlhc3NlcnRUcnVlKGF0LmlzUHVibGljKCkpOwotCQlhc3NlcnRUcnVlKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMoYXQuZ2V0U3VwZXJ0eXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUoYXQuZ2V0TWV0aG9kcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RmllbGRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRFdmVudHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEVPcGVyYXRpb25zKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJlYW5EZWNvcmF0b3JSZWZsZWN0ZWQoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCi0JCS8vIFRlc3QgdGhlIGJlYW4gZGVjb3JhdG9yLgotCQlCZWFuRGVjb3JhdG9yIGJkID0gVXRpbGl0aWVzLmdldEJlYW5EZWNvcmF0b3IodGVzdDFDbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiVGVzdDFDbGFzcyIsIGJkLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbChiZC5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0MUNsYXNzKCkgewotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9Ci0JCQkoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QxQ2xhc3MiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHRlc3QxQ2xhc3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbFJlZmxlY3RlZFByb3BlcnRpZXMoKSB7Ci0JCUVMaXN0IGFsbExvY2FsRmVhdHVyZXMgPSBnZXRUZXN0MUNsYXNzKCkuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMiwgYWxsTG9jYWxGZWF0dXJlcy5zaXplKCkpOwotCQkKLQkJSXRlcmF0b3IgaXRyID0gVXRpbGl0aWVzLmdldFByb3BlcnRpZXNJdGVyYXRvcihhbGxMb2NhbEZlYXR1cmVzKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSAoUHJvcGVydHlEZWNvcmF0b3IpIGl0ci5uZXh0KCk7Ci0JCQlpZiAocGQuZ2V0TmFtZSgpLmVxdWFscygiZm9vIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlhc3NlcnRUcnVlKHBkIGluc3RhbmNlb2YgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKTsKLQkJCQlJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IgaXAgPSAoSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKSBwZDsKLQkJCQlKYXZhSGVscGVycyB0eXBlID0gKEphdmFIZWxwZXJzKSBpcC5nZXRQcm9wZXJ0eVR5cGUoKTsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmdbXSIsIHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQlpZiAoIXR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygiamF2YS5sYW5nLlN0cmluZ1tdIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQotCQkJCU1ldGhvZCBtdGhkID0gaXAuZ2V0UmVhZE1ldGhvZCgpOwotCQkJCWFzc2VydFNhbWUocnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzLmdldEZvbygiKSwgdHJ1ZSksIG10aGQpOwotCQkJCQotCQkJCW10aGQgPSBpcC5nZXRXcml0ZU1ldGhvZCgpOwotCQkJCWFzc2VydFNhbWUocnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzLnNldEZvbyhqYXZhLmxhbmcuU3RyaW5nW10iKSwgdHJ1ZSksIG10aGQpOwotCQkJCQotCQkJCW10aGQgPSBpcC5nZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCQkJCWFzc2VydFNhbWUocnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzLmdldEZvbyhpbnQiKSwgdHJ1ZSksIG10aGQpOwotCQkJCQotCQkJCW10aGQgPSBpcC5nZXRJbmRleGVkV3JpdGVNZXRob2QoKTsKLQkJCQlhc3NlcnRTYW1lKHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDFDbGFzcy5zZXRGb28oaW50LGphdmEubGFuZy5TdHJpbmciKSwgdHJ1ZSksIG10aGQpOwotCQkJCQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZShmb3VuZCk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExvY2FsUmVmbGVjdGVkT3BlcmF0aW9ucygpIHsKLQkJSmF2YUNsYXNzIHRlc3QxQ2xhc3MgPSBnZXRUZXN0MUNsYXNzKCk7Ci0JCQotCQkvLyBUZXN0IGxvY2FsIG9wZXJhdGlvbnMuCi0JCUVMaXN0IGFsbExvY2FsT3BlcmF0aW9ucyA9IHRlc3QxQ2xhc3MuZ2V0RU9wZXJhdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBhbGxMb2NhbE9wZXJhdGlvbnMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRyID0gYWxsTG9jYWxPcGVyYXRpb25zLml0ZXJhdG9yKCk7Ci0JCS8vIFRoaXMgaXMgdGhlIGRlc2lyZWQgbWV0aG9kIHRoYXQgdGhlIG9wZXJhdGlvbiBvZiBpbnRlcmVzdCBwb2ludHMgdG8uCi0JCU1ldGhvZCBkZXNpcmVkID0KLQkJCShNZXRob2QpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKAotCQkJCSJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDFDbGFzcy5zZXRGb28oaW50LGphdmEubGFuZy5TdHJpbmciKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJTWV0aG9kUHJveHkgYmhhdiA9IChNZXRob2RQcm94eSkgaXRyLm5leHQoKTsKLQkJCWlmIChiaGF2LmdldE1ldGhvZCgpID09IGRlc2lyZWQpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJTGlzdCBwYXJtcyA9IFV0aWxpdGllcy5nZXRNZXRob2REZWNvcmF0b3IoYmhhdikuZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKTsKLQkJCQlhc3NlcnRFcXVhbHMoMiwgcGFybXMuc2l6ZSgpKTsKLQkJCQlQYXJhbWV0ZXJEZWNvcmF0b3IgcG1kID0gKFBhcmFtZXRlckRlY29yYXRvcikgcGFybXMuZ2V0KDApOwotCQkJCWFzc2VydEVxdWFscygiaW5kZXgiLCBwbWQuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGZvdW5kKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxSZWZsZWN0ZWRFdmVudHMoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCQkKLQkJLy8gVGVzdCBldmVudCBzZXQgcmVmbGVjdGVkLgotCQlMaXN0IGV2ZW50cyA9IHRlc3QxQ2xhc3MuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygyLCBldmVudHMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRyID0gZXZlbnRzLml0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZm91bmRldnQxID0gZmFsc2UsIGZvdW5kZXZ0MiA9IGZhbHNlOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJSmF2YUV2ZW50IGV2ZW50ID0gKEphdmFFdmVudCkgaXRyLm5leHQoKTsKLQkJCWlmICgidGVzdDFDbGFzc0V2ZW50Ii5lcXVhbHMoZXZlbnQuZ2V0TmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmRldnQxID0gdHJ1ZTsKLQkJCQlFdmVudFNldERlY29yYXRvciBlZGVjID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGV2ZW50KTsKLQkJCQlMaXN0IG1saXN0ID0gZWRlYy5nZXRMaXN0ZW5lck1ldGhvZHMoKTsKLQkJCQlhc3NlcnRFcXVhbHMoMiwgbWxpc3Quc2l6ZSgpKTsKLQkJCX0gZWxzZSBpZiAoInRlc3QxQ2xhc3NVbmljYXN0RXZlbnQiLmVxdWFscyhldmVudC5nZXROYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3VuZGV2dDIgPSB0cnVlOwotCQkJCUV2ZW50U2V0RGVjb3JhdG9yIGVkZWMgPSBVdGlsaXRpZXMuZ2V0RXZlbnRTZXREZWNvcmF0b3IoZXZlbnQpOwotCQkJCWFzc2VydFRydWUoZWRlYy5pc1VuaWNhc3QoKSk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShmb3VuZGV2dDEpOwotCQlhc3NlcnRUcnVlKGZvdW5kZXZ0Mik7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdDJDbGFzc0IoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3NCIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJlYW5EZWNvcmF0b3JJbnRyb3NwZWN0ZWQoKSB7Ci0JCS8vIFRlc3Qgb25lIHdpdGggYSBiZWFuaW5mby4KLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NCID0gZ2V0VGVzdDJDbGFzc0IoKTsKLQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKHRlc3QyQ2xhc3NCKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0MkNsYXNzQiIsIGJkLmdldE5hbWUoKSk7Ci0JCQotCQkvLyBUaGUgZm9sbG93aW5nIHdpbGwgdGVzdCBpZiBzZWFyY2ggYWNyb3NzIGJlYW5pbmZvIHNlYXJjaCBwYXRoIHdvcmtlZC4gSXQgd291bGQgZmFpbCBpZiBpdCBkaWRuJ3Qgd29yay4KLQkJYXNzZXJ0RXF1YWxzKCJBIG5hbWUgZm9yIHRoaXMgY2xhc3MuIiwgYmQuZ2V0RGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoYmQuaXNFeHBlcnQoKSk7Ci0JCS8vIEN1c3RvbWl6ZXIgY2xhc3Mgc2V0IGluIEJlYW5JbmZvLCBidXQgYm9ndXMgZm9yIG5vdyB0byBzYW1lIGNsYXNzIGFzIGJlaW5nIGludHJvc3BlY3RlZC4KLQkJYXNzZXJ0U2FtZSh0ZXN0MkNsYXNzQiwgYmQuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxJbnRyb3NwZWN0ZWRQcm9wZXJ0aWVzKCkgewotCQlKYXZhQ2xhc3MgdGVzdDJDbGFzc0IgPSBnZXRUZXN0MkNsYXNzQigpOwotCQlFTGlzdCBhbGxMb2NhbEZlYXR1cmVzID0gdGVzdDJDbGFzc0IuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMiwgYWxsTG9jYWxGZWF0dXJlcy5zaXplKCkpOwotCQkKLQkJSXRlcmF0b3IgaXRyID0gVXRpbGl0aWVzLmdldFByb3BlcnRpZXNJdGVyYXRvcihhbGxMb2NhbEZlYXR1cmVzKTsKLQkJYm9vbGVhbiBnb3RTZXQgPSBmYWxzZSwgZ290Rm9vID0gZmFsc2U7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IChQcm9wZXJ0eURlY29yYXRvcikgaXRyLm5leHQoKTsKLQkJCU1ldGhvZCBtdGhkID0gbnVsbDsKLQkJCWlmIChwZC5nZXROYW1lKCkuZXF1YWxzKCJzZXRBIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWdvdFNldCA9IHRydWU7Ci0JCQkJbXRoZCA9IHBkLmdldFJlYWRNZXRob2QoKTsKLQkJCQlhc3NlcnRTYW1lKHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDJDbGFzc0IuaXNTZXRBKCIpLCB0cnVlKSwgbXRoZCk7Ci0JCQl9IGVsc2UgaWYgKHBkLmdldE5hbWUoKS5lcXVhbHMoImZvbyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlnb3RGb28gPSB0cnVlOwotCQkJCUluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciBpcGQgPSAoSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKSBwZDsKLQkJCQltdGhkID0gaXBkLmdldEluZGV4ZWRSZWFkTWV0aG9kKCk7Ci0JCQkJYXNzZXJ0U2FtZShyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3NCLmdldEZvbyhpbnQiKSwgdHJ1ZSksIG10aGQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZ290U2V0KTsKLQkJYXNzZXJ0VHJ1ZShnb3RGb28pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxJbnRyb3NwZWN0ZWRPcGVyYXRpb25zKCkgewotCQlKYXZhQ2xhc3MgdGVzdDJDbGFzc0IgPSBnZXRUZXN0MkNsYXNzQigpOwotCQkKLQkJRUxpc3QgYWxsTG9jYWxPcGVyYXRpb25zID0gdGVzdDJDbGFzc0IuZ2V0RU9wZXJhdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFsbExvY2FsT3BlcmF0aW9ucy5zaXplKCkpOyAKLQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGl0ciA9IHRlc3QyQ2xhc3NCLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUVPcGVyYXRpb24gYmhhdiA9IChFT3BlcmF0aW9uKSBpdHIubmV4dCgpOwotCQkJaWYgKGJoYXYuZ2V0TmFtZSgpLmVxdWFscygic2V0U2V0QSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlMaXN0IHBhcm1zID0gVXRpbGl0aWVzLmdldE1ldGhvZERlY29yYXRvcihiaGF2KS5nZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpOwotCQkJCWFzc2VydEVxdWFscygxLCBwYXJtcy5zaXplKCkpOwotCQkJCVBhcmFtZXRlckRlY29yYXRvciBwbWQgPSAoUGFyYW1ldGVyRGVjb3JhdG9yKSBwYXJtcy5nZXQoMCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJhQm9vbGVhblNldHRpbmciLCBwbWQuZ2V0TmFtZSgpKTsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShmb3VuZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbEludHJvc3BlY3RlZEV2ZW50cygpIHsKLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NCID0gZ2V0VGVzdDJDbGFzc0IoKTsKLQkJCi0JCS8vIFRlc3QgZXZlbnQgc2V0IGludHJvc3BlY3RlZC4KLQkJRUxpc3QgZXZlbnRzID0gdGVzdDJDbGFzc0IuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBldmVudHMuc2l6ZSgpKTsKLQkJSmF2YUV2ZW50IGV2ZW50ID0gKEphdmFFdmVudCkgZXZlbnRzLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJvdmVycmlkZU5hbWUiLCBldmVudC5nZXROYW1lKCkpOyAgLy8kTk9OLU5MUy0xJAotCQlFdmVudFNldERlY29yYXRvciBlZGVjID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKCJJVGVzdDFDbGFzc0V2ZW50TGlzdGVuZXIiLCBlZGVjLmdldExpc3RlbmVyVHlwZSgpLmdldE5hbWUoKSk7Ci0JCUxpc3QgbWxpc3QgPSBlZGVjLmdldExpc3RlbmVyTWV0aG9kcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgbWxpc3Quc2l6ZSgpKTsKLQkJTWV0aG9kUHJveHkgbXByb3h5ID0gKE1ldGhvZFByb3h5KSBtbGlzdC5nZXQoMCk7Ci0JCU1ldGhvZERlY29yYXRvciBtZGVjID0gVXRpbGl0aWVzLmdldE1ldGhvZERlY29yYXRvcihtcHJveHkpOwotCQlhc3NlcnRFcXVhbHMoImV2ZW50MSIsIG1kZWMuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIkV2ZW50IDEiLCBtZGVjLmdldERpc3BsYXlOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdXBlclR5cGVzKCkgewotCQlKYXZhQ2xhc3MgdGVzdENsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCQlvYmpGZWF0dXJlc1NldHVwKCk7CS8vIEdldCBudW1iZXIgb2YgZmVhdHVyZXMgZm9yIE9iamVjdC4gVGhpcyBjYW4gdmFyeSBkZXBlbmRpbmcgb24gZXh0ZW5zaW9ucywgc28gdGhhdCBpcyB3aHkgd2UgY29tcHV0ZSBpdC4KLQkJCi0JCS8vIE5vdyBkbyB0aGUgdGVzdGluZyBvZiBtZXJnaW5nIHdpdGggc3VwZXIgdHlwZXMuCi0JCWFzc2VydEVxdWFscygyK29iakZlYXR1cmVzLCB0ZXN0Q2xhc3MuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzQSA9IGdldFRlc3QxQ2xhc3NBKCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MUNsYXNzQSk7Ci0JCWFzc2VydEVxdWFscygzK29iakZlYXR1cmVzLCB0ZXN0MUNsYXNzQS5nZXRBbGxQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldFRlc3QxQ2xhc3NBKCkgewotCQlyZXR1cm4gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzQSIpLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1cGVyVHlwZXNFdmVudHMoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzQSA9IGdldFRlc3QxQ2xhc3NBKCk7IAotCQkJCi0JCS8vIFRlc3QgbWVyZ2luZyBzdXBlcnR5cGVzIGV2ZW50IHNldC4KLQkJTGlzdCBldmVudHMgPSB0ZXN0MUNsYXNzQS5nZXRBbGxFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGV2ZW50cy5zaXplKCkpOwotCQlJdGVyYXRvciBpdHIgPSBldmVudHMuaXRlcmF0b3IoKTsKLQkJYm9vbGVhbiBmb3VuZGV2dDEgPSBmYWxzZTsKLQkJYm9vbGVhbiBmb3VuZGV2dDIgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUphdmFFdmVudCBldmVudCA9IChKYXZhRXZlbnQpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoInRlc3QxQ2xhc3NFdmVudCIuZXF1YWxzKGV2ZW50LmdldE5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZvdW5kZXZ0MSA9IHRydWU7Ci0JCQkJRXZlbnRTZXREZWNvcmF0b3IgZWRlYyA9IFV0aWxpdGllcy5nZXRFdmVudFNldERlY29yYXRvcihldmVudCk7Ci0JCQkJTGlzdCBtbGlzdCA9IGVkZWMuZ2V0TGlzdGVuZXJNZXRob2RzKCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIsIG1saXN0LnNpemUoKSk7Ci0JCQl9IGVsc2UgaWYgKCJ0ZXN0MUNsYXNzVW5pY2FzdEV2ZW50Ii5lcXVhbHMoZXZlbnQuZ2V0TmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmRldnQyID0gdHJ1ZTsKLQkJCQlFdmVudFNldERlY29yYXRvciBlZGVjID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGV2ZW50KTsKLQkJCQlhc3NlcnRUcnVlKGVkZWMuaXNVbmljYXN0KCkpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZm91bmRldnQxKTsKLQkJYXNzZXJ0VHJ1ZShmb3VuZGV2dDIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldFRlc3QyQ2xhc3MoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3MiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0MkNsYXNzQSgpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDJDbGFzc0EiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdXBlclR5cGVIaWRlUHJvcGVydHkoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MkNsYXNzID0gZ2V0VGVzdDJDbGFzcygpOwotCQlvYmpGZWF0dXJlc1NldHVwKCk7Ci0JCQotCQkvLyBUZXN0MkNsYXNzQmVhbkluZm8gZXhwbGljaXRseSBoaWRlcyBPYmplY3QgKHN1cGVyKSBmcm9tIGl0cyBCZWFuSW5mbywgc28gb25seSB0aGUgbm9uLUJlYW5JbmZvIHByb3BlcnRpZXMgd2lsbCBzaG93LgkJCi0JCWFzc2VydEVxdWFscygyK29iak5vblByb3BlcnRpZXMsIHRlc3QyQ2xhc3MuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JCQotCQkvLyBUcnkgd2l0aCBzdWJjbGFzc2VzLiBNYWtlIHN1cmUgdGhhdCBUZXN0MkNsYXNzQmVhbkluZm8gaXMgdXNlZCB3aXRoIHRoZSBzdWJjbGFzc2VzLgotCQlKYXZhQ2xhc3MgdGVzdDJDbGFzc0EgPSBnZXRUZXN0MkNsYXNzQSgpOwkJCi0JCWFzc2VydEVxdWFscygzK29iak5vblByb3BlcnRpZXMsIHRlc3QyQ2xhc3NBLmdldEFsbFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQkKLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NCID0gZ2V0VGVzdDJDbGFzc0IoKTsJCQotCQlhc3NlcnRFcXVhbHMoNCtvYmpOb25Qcm9wZXJ0aWVzLCB0ZXN0MkNsYXNzQi5nZXRBbGxQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluZGV4ZWRCZWFuSW5mbygpIHsKLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3MgPSBnZXRUZXN0MkNsYXNzKCk7Ci0JCQotCQkvLyBUZXN0IHRoYXQgSW5kZXhlZCB0aHJ1IGJlYW5pbmZvIHdvcmtzCi0JCUl0ZXJhdG9yIGl0ciA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0aWVzSXRlcmF0b3IodGVzdDJDbGFzcy5nZXRQcm9wZXJ0aWVzKCkpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7CQkKLQkJCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gKFByb3BlcnR5RGVjb3JhdG9yKSBpdHIubmV4dCgpOwkJCQotCQkJaWYgKHBkLmdldE5hbWUoKS5lcXVhbHMoImZvb0JhciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYXNzZXJ0VHJ1ZShwZCBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcik7Ci0JCQkJSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIGlwID0gKEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcikgcGQ7Ci0JCQkJSmF2YUhlbHBlcnMgdHlwZSA9IChKYXZhSGVscGVycykgaXAuZ2V0UHJvcGVydHlUeXBlKCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nW10iLCB0eXBlLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXRob2QgbXRoZCA9IGlwLmdldFJlYWRNZXRob2QoKTsKLQkJCQlhc3NlcnRTYW1lKHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDJDbGFzcy5nZXRGb29CYXIoIiksIHRydWUpLCBtdGhkKTsgLy8kTk9OLU5MUy0xJAotCQkJCW10aGQgPSBpcC5nZXRXcml0ZU1ldGhvZCgpOwotCQkJCWFzc2VydFNhbWUocnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MkNsYXNzLnNldEZvb0JhcihqYXZhLmxhbmcuU3RyaW5nW10iKSwgdHJ1ZSksIG10aGQpOyAvLyROT04tTkxTLTEkCi0JCQkJbXRoZCA9IGlwLmdldEluZGV4ZWRSZWFkTWV0aG9kKCk7Ci0JCQkJYXNzZXJ0U2FtZShyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3MuZ2V0Rm9vQmFyKGludCIpLCB0cnVlKSwgbXRoZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQltdGhkID0gaXAuZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCk7Ci0JCQkJYXNzZXJ0U2FtZShyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3Muc2V0Rm9vQmFyKGludCxqYXZhLmxhbmcuU3RyaW5nIiksIHRydWUpLCBtdGhkKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZShmb3VuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0MkNsYXNzQygpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDJDbGFzc0MiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJlYW5JbmZvUHJvamVjdCgpIHsKLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NDID0gZ2V0VGVzdDJDbGFzc0MoKTsKLQkJCi0JCS8vIFRoaXMgd2lsbCB0ZXN0IHRoYXQgd2UgY291bGQgZmluZCBUZXN0MkNsYXNzQyBCZWFuSW5mbyB0aGF0IGlzIGluIGFub3RoZXIgQmVhbkluZm8gcHJvamVjdCAoaS5lLiBhIHByb2plY3QKLQkJLy8gdGhhdCBpcyBzcGVjaWZpY2FsbHkgZm9yIEJlYW5JbmZvJ3MgZm9yIGEgc3BlY2lmaWMgY29kZSBwcm9qZWN0KS4KLQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKHRlc3QyQ2xhc3NDKTsKLQkJYXNzZXJ0Tm90TnVsbChiZCk7Ci0JCWFzc2VydEVxdWFscygiVGVzdDJDbGFzc0MgZnJvbSBCZWFuSW5mbyIsIGJkLmdldERpc3BsYXlOYW1lKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlKCkgewotCQkKLQkJLy8gVGVzdCB0aGF0IHRoZSBsb2NhbCBwcm9wZXJ0eSBpcyBleHBlcnQgYmVjYXVzZSBpdCBvdmVycm9kZSBmcm9tIFRlc3QyQ2xhc3NCIGFuZCBtYWRlIGl0IGV4cGVydC4KLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NCID0gZ2V0VGVzdDJDbGFzc0IoKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCB0aGUgbG9jYWwgcHJvcGVydHkgaXMgbm90IGV4cGVydCBpbiBUZXN0MkNsYXNzQi4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHAgPSB0ZXN0MkNsYXNzQi5nZXRFU3RydWN0dXJhbEZlYXR1cmUoInNldEEiKTsKLQkJYXNzZXJ0Tm90TnVsbChwKTsKLQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IocCk7Ci0JCWFzc2VydEZhbHNlKHBkLmlzRXhwZXJ0KCkpOwotCi0JCS8vIE5vdyBnZXQgc3ViY2xhc3Mgd2l0aCBvdmVycmlkZS4KLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NDID0gZ2V0VGVzdDJDbGFzc0MoKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCB0aGUgbG9jYWwgcHJvcGVydHkgaXMgbm93IGV4cGVydCBiZWNhdXNlIGl0IG92ZXJyb2RlIGZyb20gVGVzdDJDbGFzc0IgYW5kIG1hZGUgaXQgZXhwZXJ0LgotCQlwID0gdGVzdDJDbGFzc0MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJzZXRBIik7Ci0JCWFzc2VydE5vdE51bGwocCk7Ci0JCXBkID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKHApOwotCQlhc3NlcnRUcnVlKHBkLmlzRXhwZXJ0KCkpOwkJCi0JfQotCQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdDJDbGFzc1ByZXEoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLnByZXJlcSNUZXN0MkNsYXNzUHJlcSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdFByZXJlcWVkUHJvamVjdHMoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MkNsYXNzUHJlcmVxID0gZ2V0VGVzdDJDbGFzc1ByZXEoKTsKLQkJb2JqRmVhdHVyZXNTZXR1cCgpOwotCQkgCi0JCS8vIFRlc3QgZmluZGluZyBiZWFuaW5mb3MgZm9yIGNsYXNzZXMgaW4gYW5vdGhlciBwcm9qZWN0IChwcmUtcmVxZWQgcHJvamVjdCkuCQkKLQkJYXNzZXJ0RXF1YWxzKDErb2JqRmVhdHVyZXMsIHRlc3QyQ2xhc3NQcmVyZXEuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JCS8vIFZlcmlmeSBCZWFuSW5mbyBhbmQgbm90IGpzdXQgaW50cm9zcGVjdGlvbi4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSB0ZXN0MkNsYXNzUHJlcmVxLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgiYVNldCIpOwotCQlhc3NlcnROb3ROdWxsKGYpOwotCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihmKTsKLQkJYXNzZXJ0VHJ1ZShwZC5pc0V4cGVydCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVByb3BSZWJ1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlvYmpGZWF0dXJlc1NldHVwKCk7Ci0JCQotCQkvLyBUZXN0IHJlbW92aW5nIGEgcHJvcGVydHkgZGlyZWN0bHkgZnJvbSBhIHN1cGVyIGNsYXNzIGNhdXNlcyB0aGUgc3ViY2xhc3NlcyB0byByZS1idWlsZCB0aGVpciBwcm9wZXJ0aWVzLgotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9IGdldFRlc3QxQ2xhc3MoKTsKLQkJSmF2YUNsYXNzIHRlc3QxQ2xhc3NBID0gZ2V0VGVzdDFDbGFzc0EoKTsKLQkJLy8gR2V0IGFuZCB0ZXN0IHRoZSBwcm9wZXJ0aWVzIGZpcnN0IHRvIGNhdXNlIGludHJvc3BlY3Rpb24gZm9yIGJvdGggQkVGT1JFIHRoZSBtb2RpZmljYXRpb24uCi0JCWFzc2VydEVxdWFscygyK29iakZlYXR1cmVzLCB0ZXN0MUNsYXNzLmdldEFsbFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMytvYmpGZWF0dXJlcywgdGVzdDFDbGFzc0EuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0MUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5yZW1vdmUoMCk7IC8vIFJlbW92ZSB0aGUgZmlyc3Qgb25lLiBUaGV5IHNob3VsZCBib3RoIG5vdyByZWJ1aWxkLgotCQkJYXNzZXJ0RXF1YWxzKDErb2JqRmVhdHVyZXMsIHRlc3QxQ2xhc3MuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoMitvYmpGZWF0dXJlcywgdGVzdDFDbGFzc0EuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBOZWVkIHRvIGNsb3NlIGFuZCByZW9wZW4gdGhlIHByb2plY3Qgc28gdGhhdCB0byByZXN0b3JlIHRoZSBjb3JyZWN0IHNoYXBlIGZvciB0ZXN0MUNsYXNzIGZvciBvdGhlciB0ZXN0cy4KLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IG5hdHVyZS5nZXRQcm9qZWN0KCk7Ci0JCQlJU2NoZWR1bGluZ1J1bGUgcHJvamVjdFJ1bGUgPSB3b3Jrc3BhY2UuZ2V0UnVsZUZhY3RvcnkoKS5tb2RpZnlSdWxlKHByb2plY3QpOwotCQkJd29ya3NwYWNlLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0JCQkJCXByb2plY3Qub3Blbihtb25pdG9yKTsKLQkJCQl9Ci0JCQl9LCBwcm9qZWN0UnVsZSwgMCwgbnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUV2ZW50UmVidWlsZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCByZW1vdmluZyBhbiBldmVudCBkaXJlY3RseSBmcm9tIGEgc3VwZXIgY2xhc3MgY2F1c2VzIHRoZSBzdWJjbGFzc2VzIHRvIHJlLWJ1aWxkIHRoZWlyIGFsbEV2ZW50cy4KLQkJSmF2YUNsYXNzIHRlc3QxQ2xhc3MgPSBnZXRUZXN0MUNsYXNzKCk7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzQSA9IGdldFRlc3QxQ2xhc3NBKCk7Ci0JCS8vIEdldCBhbmQgdGVzdCB0aGUgZXZlbnRzIGZpcnN0IHRvIGNhdXNlIGludHJvc3BlY3Rpb24gZm9yIGJvdGggQkVGT1JFIHRoZSBtb2RpZmljYXRpb24uCi0JCWFzc2VydEVxdWFscygyLCB0ZXN0MUNsYXNzLmdldEFsbEV2ZW50cygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0ZXN0MUNsYXNzQS5nZXRBbGxFdmVudHMoKS5zaXplKCkpOwkJCi0JCXRyeSB7Ci0JCQl0ZXN0MUNsYXNzLmdldEV2ZW50cygpLnJlbW92ZSgwKTsgLy8gUmVtb3ZlIHRoZSBmaXJzdCBvbmUuIFRoZXkgc2hvdWxkIG5vdyBib3RoIHJlYnVpbGQuCi0JCQlhc3NlcnRFcXVhbHMoMSwgdGVzdDFDbGFzcy5nZXRBbGxFdmVudHMoKS5zaXplKCkpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3QxQ2xhc3NBLmdldEFsbEV2ZW50cygpLnNpemUoKSk7CQkJCi0JCX0gZmluYWxseSB7Ci0JCQkvLyBOZWVkIHRvIGNsb3NlIGFuZCByZW9wZW4gdGhlIHByb2plY3Qgc28gdGhhdCB0byByZXN0b3JlIHRoZSBjb3JyZWN0IHNoYXBlIGZvciB0ZXN0MUNsYXNzIGZvciBvdGhlciB0ZXN0cy4KLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBuYXR1cmUuZ2V0UHJvamVjdCgpOwotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJU2NoZWR1bGluZ1J1bGUgcHJvamVjdFJ1bGUgPSB3b3Jrc3BhY2UuZ2V0UnVsZUZhY3RvcnkoKS5tb2RpZnlSdWxlKHByb2plY3QpOwotCQkJd29ya3NwYWNlLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0JCQkJCXByb2plY3Qub3Blbihtb25pdG9yKTsKLQkJCQl9Ci0JCQl9LCBwcm9qZWN0UnVsZSwgMCwgbnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRDdXN0b21lcigpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jQ3VzdG9tZXIiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElubmVyQ2xhc3MoKSB7Ci0JCUphdmFDbGFzcyBjdXN0b21lciA9IGdldEN1c3RvbWVyKCk7Ci0JCQotCQkvLyBOb3cgdGVzdCBjdXN0b21lciB0byBtYWtlIHN1cmUgdGhhdCBpdCBpbnRyb3NwZWN0cyBjb3JyZWN0bHksIHBsdXMgdGhlIGlubmVyIGNsYXNzIG9mIG9uZSBvZiBpdHMgcHJvcGVydGllcyBkb2VzIHRvby4KLQkJTGlzdCBhbGxMb2NhbEZlYXR1cmVzID0gY3VzdG9tZXIuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMiwgYWxsTG9jYWxGZWF0dXJlcy5zaXplKCkpOwotCQlJdGVyYXRvciBpdHIgPSBhbGxMb2NhbEZlYXR1cmVzLml0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlYSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoInNhdmluZ3MiLmVxdWFscyhlYS5nZXROYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJSmF2YUNsYXNzIGlubmVyQ2xhc3MgPSAoSmF2YUNsYXNzKSBlYS5nZXRFVHlwZSgpOwkvLyBUaGlzIHByb3BlcnR5IHR5cGUgaXMgYW4gaW5uZXJjbGFzcyBvZiBDdXN0b21lcgotCQkJCWFzc2VydEVxdWFscygiQ3VzdG9tZXIkQWNjb3VudCIsIGlubmVyQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJCQlhbGxMb2NhbEZlYXR1cmVzID0gaW5uZXJDbGFzcy5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIsIGFsbExvY2FsRmVhdHVyZXMuc2l6ZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShmb3VuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0Qm91bmROb3RCb3VuZCgpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdEJvdW5kTm90Qm91bmQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vdEJvdW5kUmVmbGVjdGlvbigpIHsKLQkJSmF2YUNsYXNzIHRlc3RCb3VuZE5vdEJvdW5kID0gZ2V0VGVzdEJvdW5kTm90Qm91bmQoKTsKLQkJCi0JCS8vIE5vdyB0ZXN0IHRoYXQgcHJvcGVydGllcyBhcmUgYm91bmQgY29ycmVjdGx5IG9uIHJlZmxlY3Rpb24uIEZpcnN0IHRlc3QgcmVmbGVjdCBub3QgYm91bmQgY29ycmVjdC4KLQkJLy8gVGhpcyBpcyBkZXRlcm1pbmVkIGJ5IG5vIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbWV0aG9kIG9uIGNsYXNzLgkJCi0JCUxpc3QgYWxsTG9jYWxGZWF0dXJlcyA9IHRlc3RCb3VuZE5vdEJvdW5kLmdldFByb3BlcnRpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFsbExvY2FsRmVhdHVyZXMuc2l6ZSgpKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVhID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgYWxsTG9jYWxGZWF0dXJlcy5nZXQoMCk7Ci0JCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKGVhKTsKLQkJYXNzZXJ0Tm90TnVsbChwZCk7Ci0JCWFzc2VydEZhbHNlKHBkLmlzQm91bmQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdEJvdW5kU3VwZXIoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3RCb3VuZFN1cGVyIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCb3VuZFJlZmxlY3Rpb24oKSB7Ci0JCUphdmFDbGFzcyB0ZXN0Qm91bmRTdXBlciA9IGdldFRlc3RCb3VuZFN1cGVyKCk7Ci0JCQotCQkvLyBUZXN0IHRoYXQgcmVmbGVjdGlvbiBjYW4gZmluZCBib3VuZCBwcm9wZXJ0eS4KLQkJLy8gVGhpcyBpcyBkZXRlcm1pbmVkIGJ5IGZpbmRpbmcgYWRkL3JlbW92ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG1ldGhvZCBvbiBjbGFzcy4JCQotCQlMaXN0IGFsbExvY2FsRmVhdHVyZXMgPSB0ZXN0Qm91bmRTdXBlci5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBhbGxMb2NhbEZlYXR1cmVzLnNpemUoKSk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlYSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbExvY2FsRmVhdHVyZXMuZ2V0KDApOwotCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihlYSk7Ci0JCWFzc2VydE5vdE51bGwocGQpOwotCQlhc3NlcnRUcnVlKHBkLmlzQm91bmQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0Qm91bmRTdWIoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3RCb3VuZFN1YiIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Qm91bmRSZWZsZWN0aW9uU3ViY2xhc3MoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0Qm91bmRTdWIgPSBnZXRUZXN0Qm91bmRTdWIoKTsKLQotCQkvLyBUZXN0IHRoYXQgcmVmbGVjdGlvbiBjYW4gZmluZCBib3VuZCBwcm9wZXJ0eSBkdWUgdG8gaW5oZXJpdCBmcm9tIGEgYm91bmQgY2xhc3MuCi0JCS8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBieSBmaW5kaW5nIGFkZC9yZW1vdmUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBtZXRob2Qgb24gY2xhc3MgKGJ1dCBmcm9tIGEgc3VwZXIgY2xhc3MpLgkJCQkJCQotCQlMaXN0IGFsbExvY2FsRmVhdHVyZXMgPSB0ZXN0Qm91bmRTdWIuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWxsTG9jYWxGZWF0dXJlcy5zaXplKCkpOwkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlYSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbExvY2FsRmVhdHVyZXMuZ2V0KDApOwotCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihlYSk7Ci0JCWFzc2VydE5vdE51bGwocGQpOwotCQlhc3NlcnRUcnVlKHBkLmlzQm91bmQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZXNGaWxlKCkgewotCQkvLyBUZXN0IHRoYXQgb3ZlcnJpZGUgZmlsZXMgZ2V0IGFwcGxpZWQgY29ycmVjdGx5LgotCQlKYXZhQ2xhc3MgdGVzdE92ZXJyaWRlID0gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0T3ZlcnJpZGVzIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwodGVzdE92ZXJyaWRlKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHh5eiA9IHRlc3RPdmVycmlkZS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoInh5eiIpOwotCQlhc3NlcnROb3ROdWxsKHh5eik7Ci0JCS8vIFRlc3QgdGhhdCBpdCBoYXMgdGhlIGNvcnJlY3QgdHlwZSBzbyB0aGF0IHdlIGtub3cgaXQgd2FzIHJlZmxlY3RlZCBjb3JyZWN0bHkuCi0JCWFzc2VydEVxdWFscyhyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovI2ludCIpLCB0cnVlKSwgeHl6LmdldEVUeXBlKCkpOwotCQkKLQkJLy8gVGVzdCB0aGF0IHdlIGhhdmUgdGhlIGFubm90YXRpb24gd2UgYWRkZWQuCi0JCWFzc2VydE5vdE51bGwoeHl6LmdldEVBbm5vdGF0aW9uKCJPdmVycmlkZSBBbm5vdGF0aW9uIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0NzkwODMoKSB7Ci0JCS8vIFRlc3QgYnVnIDc5MDgzOiBOdWxsIEVUeXBlcyBmcm9tIG92ZXJyaWRlcyB0aGF0IGRpZG4ndCBoYXZlIGEgcmVmbGVjdGlvbiB0byBnaXZlIGl0IHRoZSB0eXBlLiBCZWFuSW5mbyBzaG91bGQgbWFrZSBpdCBFT2JqZWN0IHR5cGUuCi0JCUphdmFDbGFzcyB0ZXN0T3ZlcnJpZGUgPSAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3RPdmVycmlkZXMiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0T3ZlcnJpZGUpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgdGVzdDc5MDgzID0gdGVzdE92ZXJyaWRlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgidGVzdDc5MDgzIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDc5MDgzKTsKLQkJYXNzZXJ0RXF1YWxzKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU9iamVjdCgpLCB0ZXN0NzkwODMuZ2V0RVR5cGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2luc3RhbnRpYXRpb24vSW5zdGFudGlhdGlvblN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzBiOTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuaW5zdGFudGlhdGlvbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEluc3RhbnRpYXRpb25TdWl0ZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo1NiAkIAotICovCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5KYXZhSW5zdGFudGlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVByb2plY3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhVGVzdHNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLkFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFudGlhdGlvblN1aXRlIGV4dGVuZHMgVGVzdFNldHVwIHsKLQotCS8vIFRlc3QgY2FzZXMgdG8gYmUgaW5jbHVkZSBpbiB0aGUgc3VpdGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyB0ZXN0c0xpc3RbXSA9IHsgVGVzdFN0YW5kYXJkLmNsYXNzLCB9OwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEluc3RhbnRpYXRpb25TdWl0ZSgpIHsKLQkJdGhpcygiVGVzdCBJbnN0YW50aWF0aW9uIFN1aXRlIik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgSW5zdGFudGlhdGlvblN1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5ldyBUZXN0U3VpdGUobmFtZSkgewotCQkJewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHNMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pOwotCQkJCX0KLQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgSW5zdGFudGlhdGlvblN1aXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG9sZEF1dG9CdWlsZGluZ1N0YXRlOyAvLyBhdXRvQnVpbGRpbmcgc3RhdGUgYmVmb3JlIHdlIHN0YXJ0ZWQuCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gSW5pdGlhbGl6aW5nIHRoZSBJbnN0YW50aWF0aW9uIHRlc3QgZGF0YSAtLSIpOyAvLyROT04tTkxTLTEkCi0JCW9sZEF1dG9CdWlsZGluZ1N0YXRlID0gSmF2YVByb2plY3RVdGlsLnNldEF1dG9CdWlsZCh0cnVlKTsKLQkJVVJMIGluc3RhbGxVUkwgPSBKYXZhVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLQkJU3RyaW5nW10gemlwUGF0aHMgPSBuZXcgU3RyaW5nWzJdOwotCQl6aXBQYXRoc1swXSA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChuZXcgVVJMKGluc3RhbGxVUkwsICJ0ZXN0ZGF0YS90ZXN0YmVhbmluZm8uemlwIikpLmdldEZpbGUoKTsKLQkJemlwUGF0aHNbMV0gPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTChpbnN0YWxsVVJMLCAidGVzdGRhdGEvdGVzdGJlYW5pbmZvcHJlcS56aXAiKSkuZ2V0RmlsZSgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0KLQkJCUphdmFQcm9qZWN0VXRpbC5pbXBvcnRQcm9qZWN0cygKLQkJCQluZXcgU3RyaW5nW10geyBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUk9KRUNULCBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUkVSRVFfUFJPSkVDVCB9LAotCQkJCXppcFBhdGhzKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0c1swXSk7Ci0JCWFzc2VydE5vdE51bGwocHJvamVjdHNbMV0pOwotCQlKYXZhUHJvamVjdFV0aWwud2FpdEZvckF1dG9CdWlsZCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tIERhdGEgaW5pdGlhbGl6ZWQgLS0iKTsgLy8kTk9OLU5MUy0xJAotCi0JCUJlYW5pbmZvTmF0dXJlIG5hdHVyZSA9IEJlYW5pbmZvTmF0dXJlLmdldFJ1bnRpbWUocHJvamVjdHNbMF0pOwotCQlhc3NlcnROb3ROdWxsKG5hdHVyZSk7Ci0JCUphdmFJbnN0YW50aWF0aW9uLmluaXRpYWxpemUobmF0dXJlLmdldFJlc291cmNlU2V0KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlKYXZhUHJvamVjdFV0aWwuZGVsZXRlUHJvamVjdChKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUk9KRUNUKSk7Ci0JCQkJSmF2YVByb2plY3RVdGlsLmRlbGV0ZVByb2plY3QoSmF2YVByb2plY3RVdGlsLmdldFByb2plY3QoQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fUFJFUkVRX1BST0pFQ1QpKTsKLQkJCX0KLQkJfSwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgMCwgbnVsbCk7Ci0KLQkJSmF2YVByb2plY3RVdGlsLnNldEF1dG9CdWlsZChvbGRBdXRvQnVpbGRpbmdTdGF0ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9pbnN0YW50aWF0aW9uL1Rlc3RTdGFuZGFyZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvaW5zdGFudGlhdGlvbi9UZXN0U3RhbmRhcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyYTdiOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9pbnN0YW50aWF0aW9uL1Rlc3RTdGFuZGFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLmluc3RhbnRpYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuaW5mb05hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVByb2plY3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5BYnN0cmFjdEJlYW5JbmZvVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0U3RhbmRhcmQgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVGVzdFN0YW5kYXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFRlc3RTdGFuZGFyZChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQmVhbmluZm9OYXR1cmUgbmF0dXJlOwotCXByb3RlY3RlZCBSZXNvdXJjZVNldCByc2V0OwotCXByb3RlY3RlZCBKYXZhSGVscGVycyBib29sVHlwZTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJSVByb2plY3QgYmlQcm9qZWN0ID0gSmF2YVByb2plY3RVdGlsLmdldFByb2plY3QoQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fUFJPSkVDVCk7Ci0JCWFzc2VydE5vdE51bGwoYmlQcm9qZWN0KTsKLQkJbmF0dXJlID0gQmVhbmluZm9OYXR1cmUuZ2V0UnVudGltZShiaVByb2plY3QpOwotCQlhc3NlcnROb3ROdWxsKG5hdHVyZSk7Ci0JCXJzZXQgPSBuYXR1cmUuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJYXNzZXJ0Tm90TnVsbChyc2V0KTsKLQkJYm9vbFR5cGUgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImJvb2xlYW4iLCByc2V0KTsKLQkJYXNzZXJ0Tm90TnVsbChib29sVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0MUNsYXNzKCkgewotCQlyZXR1cm4gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uVGVzdDFDbGFzcyIsIHJzZXQpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaXQoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCi0JCS8vIFRlc3QgaW5zdGFudGlhdGUgYW4gaW5zdGFuY2UuCi0JCUlKYXZhT2JqZWN0SW5zdGFuY2UgamkxID0gKElKYXZhT2JqZWN0SW5zdGFuY2UpIHRlc3QxQ2xhc3MuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKHRlc3QxQ2xhc3MpOwotCQlqaTEuc2V0QWxsb2NhdGlvbihJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFN0cmluZ0FsbG9jYXRpb24oIm5ldyBUZXN0MUNsYXNzKCkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0SW5pdChqaTEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhc3NlcnRJbml0KElKYXZhT2JqZWN0SW5zdGFuY2UgamkxKSB7Ci0JCS8vIEhlcmUgYmVjYXVzZSB0d28gdGVzdHMgd2lsbCBkbyBzYW1lIHRlc3Qgc2VxdWVuY2UuCi0JCWFzc2VydFRydWUoamkxLmlzU2V0QWxsb2NhdGlvbigpKTsKLQkJSW5pdFN0cmluZ0FsbG9jYXRpb24gYWxsb2MgPSAoSW5pdFN0cmluZ0FsbG9jYXRpb24pIGppMS5nZXRBbGxvY2F0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygibmV3IFRlc3QxQ2xhc3MoKSIsIGFsbG9jLmdldEluaXRTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlBY2Nlc3MoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCQlJSmF2YU9iamVjdEluc3RhbmNlIGppMSA9IChJSmF2YU9iamVjdEluc3RhbmNlKSB0ZXN0MUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZSh0ZXN0MUNsYXNzKTsKLQkJamkxLnNldEFsbG9jYXRpb24oSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCJuZXcgVGVzdDFDbGFzcygpIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gVGVzdCBwcm9wZXJ0eSBzZXQvZ2V0IG9mIGEgZHluYW1pYyBwcm9wZXJ0eS4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHNldFNGID0gdGVzdDFDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmUoInNldCIpOwotCQlhc3NlcnROb3ROdWxsKHNldFNGKTsKLQkJYXNzZXJ0U2FtZShib29sVHlwZSwgc2V0U0YuZ2V0RVR5cGUoKSk7Ci0JCUlKYXZhRGF0YVR5cGVJbnN0YW5jZSBzZXR0aW5nID0gKElKYXZhRGF0YVR5cGVJbnN0YW5jZSkgc2V0U0YuZ2V0RVR5cGUoKS5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKS5jcmVhdGUoKEVDbGFzcykgc2V0U0YuZ2V0RVR5cGUoKSk7Ci0JCXNldHRpbmcuc2V0QWxsb2NhdGlvbihJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFN0cmluZ0FsbG9jYXRpb24oInRydWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJamkxLmVTZXQoCi0JCQlzZXRTRiwKLQkJCXNldHRpbmcpOwotCQlhc3NlcnRQcm9wZXJ0eShqaTEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhc3NlcnRQcm9wZXJ0eShJSmF2YU9iamVjdEluc3RhbmNlIGppMSkgewotCQkvLyBIZXJlIGJlY2F1c2UgdHdvIHRlc3RzIHdpbGwgZG8gc2FtZSB0ZXN0IHNlcXVlbmNlLgotCQlFU3RydWN0dXJhbEZlYXR1cmUgc2V0U0YgPSBqaTEuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJzZXQiKTsKLQkJT2JqZWN0IHYgPSBqaTEuZUdldChzZXRTRik7Ci0JCWFzc2VydE5vdE51bGwodik7Ci0JCWFzc2VydFRydWUodiBpbnN0YW5jZW9mIElKYXZhRGF0YVR5cGVJbnN0YW5jZSk7Ci0JCUlKYXZhRGF0YVR5cGVJbnN0YW5jZSBkdHYgPSAoSUphdmFEYXRhVHlwZUluc3RhbmNlKSB2OwotCQlhc3NlcnRTYW1lKGJvb2xUeXBlLCBkdHYuZ2V0SmF2YVR5cGUoKSk7Ci0JCWFzc2VydFRydWUoZHR2LmlzU2V0QWxsb2NhdGlvbigpKTsKLQkJSW5pdFN0cmluZ0FsbG9jYXRpb24gYWxsb2MgPSAoSW5pdFN0cmluZ0FsbG9jYXRpb24pIGR0di5nZXRBbGxvY2F0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIGFsbG9jLmdldEluaXRTdHJpbmcoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElKYXZhT2JqZWN0SW5zdGFuY2Ugc2V0dXBJbnN0YW5jZSgpIHsKLQkJLy8gU2V0dXAgdGhlIHN0YW5kYXJkIHRlc3QgaW5zdGFuY2Ugd2l0aG91dCB0aGUgYXNzZXJ0aW9ucy4gRm9yIHVzZSBpbiBvdGhlciB0ZXN0cy4KLQkJSmF2YUNsYXNzIHRlc3QxQ2xhc3MgPSBnZXRUZXN0MUNsYXNzKCk7Ci0JCUlKYXZhT2JqZWN0SW5zdGFuY2UgamkxID0gKElKYXZhT2JqZWN0SW5zdGFuY2UpIHRlc3QxQ2xhc3MuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKHRlc3QxQ2xhc3MpOwotCQlqaTEuc2V0QWxsb2NhdGlvbihJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFN0cmluZ0FsbG9jYXRpb24oIm5ldyBUZXN0MUNsYXNzKCkiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBUZXN0IHByb3BlcnR5IHNldC9nZXQgb2YgYSBkeW5hbWljIHByb3BlcnR5LgotCQlFU3RydWN0dXJhbEZlYXR1cmUgc2V0U0YgPSB0ZXN0MUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgic2V0Iik7Ci0JCUlKYXZhRGF0YVR5cGVJbnN0YW5jZSBzZXR0aW5nID0gKElKYXZhRGF0YVR5cGVJbnN0YW5jZSkgc2V0U0YuZ2V0RVR5cGUoKS5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKS5jcmVhdGUoKEVDbGFzcykgc2V0U0YuZ2V0RVR5cGUoKSk7Ci0JCXNldHRpbmcuc2V0QWxsb2NhdGlvbihJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFN0cmluZ0FsbG9jYXRpb24oInRydWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJamkxLmVTZXQoCi0JCQlzZXRTRiwKLQkJCXNldHRpbmcpOwotCQlyZXR1cm4gamkxOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgc2V0dXBSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlKYXZhT2JqZWN0SW5zdGFuY2UgamkxID0gc2V0dXBJbnN0YW5jZSgpOwotCi0JCS8vIFdyaXRlIGl0IG91dCwgc2VlIGlmIGl0IGlzIHdoYXQgaXQgc2hvdWxkIGJlLCB0aGVuIHJlYWQgaXQgaW4gYW5kIHNlZSBpZiBpdCBsb2FkcyBjb3JyZWN0bHkuCi0JCVJlc291cmNlU2V0IHJzd29yazEgPSBuYXR1cmUubmV3UmVzb3VyY2VTZXQoKTsgLy8gUnNvdXJjZSBzZXQgdG8gd3JpdGUgZnJvbQotCi0JCVJlc291cmNlIHIgPSByc3dvcmsxLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoImYueG1pIikpOyAvLyROT04tTkxTLTEkCi0JCXIuZ2V0Q29udGVudHMoKS5hZGQoamkxKTsKLQkJLy8gQml0IG9mIGEga2x1ZGdlLCBidXQgYWxsIHJlZmVyZW5jZXMgaW4gamF2YSBtb2RlbCBhcmUgc2hhcmVkLCBzbyB0byBzZXJpYWxpemUgd2UgbmVlZCB0byBnZXQgdGhlIAotCQkvLyAic2V0IiBzZXR0aW5nIGFuZCBhZGQgdG8gdGhlIHJlc291cmNlIHNvIHRoYXQgaXQgaXMgY29udGFpbmVkIHNvbWV3aGVyZS4KLQkJci5nZXRDb250ZW50cygpLmFkZChqaTEuZUdldChqaTEuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJzZXQiKSkpOwotCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBibyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJci5zYXZlKGJvLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQlyZXR1cm4gYm8udG9TdHJpbmcoKTsKLQl9Ci0KLS8qCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUZXN0IHRoZSBzZXJpYWxpemF0aW9uIHRoYXQgaXQgcHJvZHVjZXMgY29ycmVjdCBvdXRwdXQgc3RyaW5nLgotCQlTdHJpbmcgb3V0ID0gc2V0dXBSZXNvdXJjZSgpOwotCQkvLyBOZWVkIHRvIGNyZWF0ZSBhIHByaW50IHN0cmVhbSBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBsb2NhbCBuZXdsaW5lIGNoYXJzIGluIHRvIG1hdGNoIGZyb20gdGhlIHJlc291cmNlLgotCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKG91dC5sZW5ndGgoKSArIDUwKTsKLQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCQlwdy5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJBU0NJSVwiPz4iKTsKLQkJcHcucHJpbnRsbigKLQkJCSI8eG1pOlhNSSB4bWk6dmVyc2lvbj1cIjIuMFwiIHhtbG5zOnhtaT1cImh0dHA6Ly93d3cub21nLm9yZy9YTUlcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhtbG5zOl8tamF2YXByaW09XCJqYXZhOi9cIiB4bWxuczpvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbj1cImh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmVcIiB4bWxuczpvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm89XCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm9cIj4iKTsKLQkJcHcucHJpbnRsbigiICA8b3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvOlRlc3QxQ2xhc3Mgc2V0PVwiLzFcIj4iKTsKLQkJcHcucHJpbnRsbigiICAgIDxhbGxvY2F0aW9uIHhzaTp0eXBlPVwib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb246SW5pdFN0cmluZ0FsbG9jYXRpb25cIiBpbml0U3RyaW5nPVwibmV3IFRlc3QxQ2xhc3MoKVwiLz4iKTsKLQkJcHcucHJpbnRsbigiICA8L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbzpUZXN0MUNsYXNzPiIpOwotCQlwdy5wcmludGxuKCIgIDxfLWphdmFwcmltOmJvb2xlYW4+Iik7Ci0JCXB3LnByaW50bG4oIiAgICA8YWxsb2NhdGlvbiB4c2k6dHlwZT1cIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOkluaXRTdHJpbmdBbGxvY2F0aW9uXCIgaW5pdFN0cmluZz1cInRydWVcIi8+Iik7Ci0JCXB3LnByaW50bG4oIiAgPC9fLWphdmFwcmltOmJvb2xlYW4+Iik7Ci0JCXB3LnByaW50bG4oIjwveG1pOlhNST4iKTsKLQkJcHcuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKHN3LnRvU3RyaW5nKCksIG91dCk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgcmVhZGluZyBzZXJpYWxpemF0aW9uIGJhY2sgaW4gcHJvZHVjZXMgY29ycmVjdCBvYmplY3RzLgotCQkvLyBSZXJ1biB0ZXN0cy4KLQkJU3RyaW5nIG91dCA9IHNldHVwUmVzb3VyY2UoKTsKLQotCQlSZXNvdXJjZVNldCByc3dvcmsyID0gbmF0dXJlLm5ld1Jlc291cmNlU2V0KCk7IC8vIFJlc291cmNlIHNldCB0byByZWFkIGludG8KLQkJUmVzb3VyY2UgckluID0gcnN3b3JrMi5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJmMS54bWkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJckluLmxvYWQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC5nZXRCeXRlcygpKSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJSmF2YUNsYXNzIHRlc3QxQ2xhc3MgPSBnZXRUZXN0MUNsYXNzKCk7Ci0JCUlKYXZhT2JqZWN0SW5zdGFuY2UgamkxID0gKElKYXZhT2JqZWN0SW5zdGFuY2UpIEVjb3JlVXRpbC5nZXRPYmplY3RCeVR5cGUockluLmdldENvbnRlbnRzKCksIHRlc3QxQ2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKGppMSk7Ci0JCWFzc2VydEluaXQoamkxKTsKLQkJYXNzZXJ0UHJvcGVydHkoamkxKTsKLQl9Ci0qLwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9JTGlzdGVuZXJUZXN0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL0lMaXN0ZW5lclRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U1NjYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL0lMaXN0ZW5lclRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUxpc3RlbmVyVGVzdGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci0gCi0KLS8qKgotICogRm9yIG1hbnkgb2YgdGhlIGxpc3RlbmVyIHRlc3RzLCB0aGUgYWN0dWFsIEFzc2VydCBpcyBkb25lIG9uIGEgc2FmZSBydW5uYWJsZSBzbyB0aGF0IGl0IGNhbid0IGJlIAotICogbm9ybWFsbHkgc2VudC4gU28gd2Ugd2lsbCBoYXZlIGEgbGlzdGVuZXIgdGVzdGVyIHRoYXQgd2lsbCByZXRyaWV2ZSB0aGUgZXhjZXB0aW9uIGFuZCB3aWxsCi0gKiBiZSBjYWxsZWQgdG8gZ2V0IGl0IGZyb20gdGhlIG1haW4gdGhyZWFkLgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpc3RlbmVyVGVzdGVyIHsKLQotCXB1YmxpYyB2b2lkIGlzRXhjZXB0aW9uKCkgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yOwotCXB1YmxpYyB2b2lkIGlzQ29tcGxldGUoKSB0aHJvd3MgQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9MaXN0ZW5lcnNTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvTGlzdGVuZXJzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1NDEzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9MaXN0ZW5lcnNTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IExpc3RlbmVyc1N1aXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NTYgJCAKLSAqLwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFQcm9qZWN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVRlc3RzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5BYnN0cmFjdEJlYW5JbmZvVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqLwotcHVibGljIGNsYXNzIExpc3RlbmVyc1N1aXRlIGV4dGVuZHMgVGVzdFNldHVwIHsKLQotCS8vIFRlc3QgY2FzZXMgdG8gYmUgaW5jbHVkZSBpbiB0aGUgc3VpdGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyB0ZXN0c0xpc3RbXSA9IHsgVGVzdEpFTS5jbGFzcywgVGVzdEJlYW5JbmZvLmNsYXNzfTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBMaXN0ZW5lcnNTdWl0ZSgpIHsKLQkJdGhpcygiVGVzdCBMaXN0ZW5lcnMgU3VpdGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBMaXN0ZW5lcnNTdWl0ZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuZXcgVGVzdFN1aXRlKG5hbWUpIHsKLQkJCXsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RzTGlzdC5sZW5ndGg7IGkrKykgewotCQkJCQlhZGRUZXN0U3VpdGUodGVzdHNMaXN0W2ldKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IExpc3RlbmVyc1N1aXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG9sZEF1dG9CdWlsZGluZ1N0YXRlOyAvLyBhdXRvQnVpbGRpbmcgc3RhdGUgYmVmb3JlIHdlIHN0YXJ0ZWQuCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gSW5pdGlhbGl6aW5nIHRoZSBMaXN0ZW5lcnMgdGVzdCBkYXRhIC0tIik7IC8vJE5PTi1OTFMtMSQKLQkJb2xkQXV0b0J1aWxkaW5nU3RhdGUgPSBKYXZhUHJvamVjdFV0aWwuc2V0QXV0b0J1aWxkKHRydWUpOwotCQlVUkwgaW5zdGFsbFVSTCA9IEphdmFUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotCQlTdHJpbmdbXSB6aXBQYXRocyA9IG5ldyBTdHJpbmdbMl07Ci0JCXppcFBhdGhzWzBdID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKG5ldyBVUkwoaW5zdGFsbFVSTCwgInRlc3RkYXRhL3Rlc3RiZWFuaW5mby56aXAiKSkuZ2V0RmlsZSgpOwotCQl6aXBQYXRoc1sxXSA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChuZXcgVVJMKGluc3RhbGxVUkwsICJ0ZXN0ZGF0YS90ZXN0YmVhbmluZm9wcmVxLnppcCIpKS5nZXRGaWxlKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPQotCQkJSmF2YVByb2plY3RVdGlsLmltcG9ydFByb2plY3RzKAotCQkJCW5ldyBTdHJpbmdbXSB7IEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BST0pFQ1QsIEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BSRVJFUV9QUk9KRUNUIH0sCi0JCQkJemlwUGF0aHMpOwotCQlhc3NlcnROb3ROdWxsKHByb2plY3RzWzBdKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0c1sxXSk7Ci0JCUphdmFQcm9qZWN0VXRpbC53YWl0Rm9yQXV0b0J1aWxkKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gRGF0YSBpbml0aWFsaXplZCAtLSIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJSmF2YVByb2plY3RVdGlsLmRlbGV0ZVByb2plY3QoSmF2YVByb2plY3RVdGlsLmdldFByb2plY3QoQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fUFJPSkVDVCkpOwotCQkJCUphdmFQcm9qZWN0VXRpbC5kZWxldGVQcm9qZWN0KEphdmFQcm9qZWN0VXRpbC5nZXRQcm9qZWN0KEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BSRVJFUV9QUk9KRUNUKSk7Ci0JCQl9Ci0JCX0sIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIDAsIG51bGwpOwotCi0JCUphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQob2xkQXV0b0J1aWxkaW5nU3RhdGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvVGVzdEJlYW5JbmZvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0QmVhbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5ZDBkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0QmVhbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RCZWFuSW5mby5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNi8wOS8xOCAyMjo1Nzo1NSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9Nb2RlbFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5JQmVhbmluZm9TdXBwbGllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldDsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIGZvciB0ZXN0aW5nIHRoZSBKRU0gUmVmbGVjdGlvbiBsaXN0ZW5lcnMKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEJlYW5JbmZvIGV4dGVuZHMgVGVzdExpc3RlbmVycyB7Ci0JCi0JQmVhbmluZm9Nb2RlbFN5bmNocm9uaXplciBzeW5jOwotCVRlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZhY3RvcnkgPSBuZXcgVGVzdEJlYW5pbmZvQWRhcHRlckZhY3RvcnkobmV3IElCZWFuaW5mb1N1cHBsaWVyKCkgewotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLklCZWFuaW5mb1N1cHBsaWVyI2dldFJlZ2lzdHJ5KCkKLQkJCSAqLwotCQkJcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLklCZWFuaW5mb1N1cHBsaWVyI2lzUmVnaXN0cnlDcmVhdGVkKCkKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaXNSZWdpc3RyeUNyZWF0ZWQoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLklCZWFuaW5mb1N1cHBsaWVyI2Nsb3NlUmVnaXN0cnkoKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBjbG9zZVJlZ2lzdHJ5KCkgewotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLklCZWFuaW5mb1N1cHBsaWVyI2dldFByb2plY3QoKQotCQkJICovCi0JCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJCQlyZXR1cm4ganAuZ2V0UHJvamVjdCgpOwotCQkJfQotCi0JCQlwdWJsaWMgUHJvamVjdFJlc291cmNlU2V0IGdldE5ld1Jlc291cmNlU2V0KCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UHJvamVjdFJlc291cmNlU2V0KCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9KTsJLy8gTmVlZHMgdG8gYmUgc2V0IGZpcnN0IHNvIHRoYXQgc3VwZXIuc2V0VVAoKSBjYWxscyB0byBzcGVjaWFsIHNldHVwcyB3aWxsIGhhdmUgYSBmYWN0b3J5LgotCQlzdXBlci5zZXRVcCgpOwkvLyBDYWxsZWQgZmlyc3Qgc28gdGhhdCBhbnkgc2V0dXAgd29uJ3QgZmlyZSBvdXIgc3luY2hyb25pemVyLgotCQkKLQkJLy8gQmFzaWMgZm9yIHRoaXMgaXMgYWRkIG91ciBzcGVjaWFsIGxpc3RlbmVyLiAoRG9uJ3QgbmVlZCBmdWxsIEpFTSBtb2RlbCBjbHV0dGVyaW5nIHRoaW5ncyB1cCkuCQkKLQkJc3luYyA9IG5ldyBCZWFuaW5mb01vZGVsU3luY2hyb25pemVyKGZhY3RvcnksIGpwKTsKLQkJc2V0VGVzdGVyKGZhY3RvcnkpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcENsb3NlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcENsb3NlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwQ2xvc2UoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFswXSwgbmV3IE9iamVjdFswXSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwT3BlbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBPcGVuKCkgewotCQlzdXBlci5zZXRVcE9wZW4oKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFswXSwgbmV3IE9iamVjdFswXSk7CQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBBZGRNZXRob2RJbldvcmtpbmdDb3B5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcEFkZE1ldGhvZEluV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBBZGRNZXRob2RJbldvcmtpbmdDb3B5KCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbMF0sIG5ldyBPYmplY3RbMF0pOwkJCi0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwU2F2ZUZyb21Xb3JraW5nQ29weSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBTYXZlRnJvbVdvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwU2F2ZUZyb21Xb3JraW5nQ29weSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5Lk1BUktfU1RBTEVfSU5UUk9TUEVDVElPTl9QTFVTX0lOTkVSfSwgbmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uVGVzdDFDbGFzcyIsIEJvb2xlYW4uRkFMU0V9fSk7IAkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwUmV2ZXJ0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcFJldmVydCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcFJldmVydCgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50WzBdLCBuZXcgT2JqZWN0WzBdKTsJCQotCX0KLQkKLS8vCS8qIChub24tSmF2YWRvYykKLS8vCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0dXBEZWxldGVNZXRob2ROb1dvcmtpbmdDb3B5KCkKLS8vCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgc2V0dXBEZWxldGVNZXRob2ROb1dvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0vLwkJc3VwZXIuc2V0dXBEZWxldGVNZXRob2ROb1dvcmtpbmdDb3B5KCk7Ci0vLwkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeS5NQVJLX1NUQUxFX0lOVFJPU1BFQ1RJT05fUExVU19JTk5FUn0sIG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLlRlc3QxQ2xhc3MiLCBCb29sZWFuLkZBTFNFfX0pOwkJCi0vLwl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0dXBBZGRDbGFzcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBBZGRDbGFzcygpIHsKLQkJc3VwZXIuc2V0dXBBZGRDbGFzcygpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5Lk1BUktfU1RBTEVfSU5UUk9TUEVDVElPTl9QTFVTX0lOTkVSfSwgbmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uTmV3Q2xhc3MiLCBCb29sZWFuLlRSVUV9fSk7CQkJCQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXR1cERlbGV0ZUNsYXNzV2l0aFdvcmtpbmdDb3B5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERlbGV0ZUNsYXNzV2l0aFdvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldHVwRGVsZXRlQ2xhc3NXaXRoV29ya2luZ0NvcHkoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeS5NQVJLX1NUQUxFX0lOVFJPU1BFQ1RJT05fUExVU19JTk5FUiwgVGVzdEJlYW5pbmZvQWRhcHRlckZhY3RvcnkuTUFSS19TVEFMRV9JTlRST1NQRUNUSU9OX1BMVVNfSU5ORVJ9LCBuZXcgT2JqZWN0W10ge25ldyBPYmplY3RbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5OZXdDbGFzcyIsIEJvb2xlYW4uRkFMU0V9LCBuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uTmV3Q2xhc3MiLCBCb29sZWFuLlRSVUV9fSk7CQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBEZWxldGVDbGFzc05vV29ya2luZ0NvcHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEJlYW5pbmZvQWRhcHRlckZhY3RvcnkuTUFSS19TVEFMRV9JTlRST1NQRUNUSU9OX1BMVVNfSU5ORVJ9LCBuZXcgT2JqZWN0W10ge25ldyBPYmplY3RbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5OZXdDbGFzcyIsIEJvb2xlYW4uVFJVRX19KTsJCQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcEFkZFBhY2thZ2UoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwQWRkUGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcEFkZFBhY2thZ2UoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeS5NQVJLX1BBQ0tBR0VfU1RBTEV9LCBuZXcgT2JqZWN0W10geyJ0ZXN0In0pOwkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwRGVsZXRlUGFja2FnZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBEZWxldGVQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwRGVsZXRlUGFja2FnZSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5Lk1BUktfUEFDS0FHRV9TVEFMRX0sIG5ldyBPYmplY3RbXSB7InRlc3QifSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3luYy5zdG9wU3luY2hyb25pemVyKHRydWUpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2VkNzI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVGVzdEJlYW5pbmZvQWRhcHRlckZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNi8wOS8xOCAyMjo1Nzo1NSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuSUJlYW5pbmZvU3VwcGxpZXI7Ci0KLS8qKgotICogVGVzdCBmYWN0b3J5IHRvIGhhbmRsZSB0aGUgY2FsbHMgZnJvbSB0aGUgbGlzdGVuZXIgZHVyaW5nIG91ciB0ZXN0cy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEJlYW5pbmZvQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTGlzdGVuZXJUZXN0ZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHN1cHBsaWVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFRlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5KElCZWFuaW5mb1N1cHBsaWVyIHN1cHBsaWVyKSB7Ci0JCXN1cGVyKHN1cHBsaWVyKTsKLQl9Ci0JCi0JaW50IGNhbGxJbmRleCA9IC0xOyAvLyBJbmRleCBvZiBjYWxscyBpbnRvIGNvbnRyb2wgbGlzdC4KLQotCUFzc2VydGlvbkZhaWxlZEVycm9yIGV4Y2VwdGlvbjsgLy8gU2V0IGlmIGV4Y2VwdGlvbiBvY2N1cmVkLgotCi0JcHJvdGVjdGVkIGludFtdIGNhbGxUeXBlczsgLy8gT3JkZXIgb2YgcGVybWl0dGVkIGNhbGx0eXBlcy4gSWYgYW55IGNvbWUgb3V0IG9mIG9yZGVyLCB0aGVuIGVycm9yLgotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGNhbGxBcmdzOyAvLyBDb3JyZXNwb25kaW5nIGFyZ3MgZm9yIGVhY2ggY2FsbCB0eXBlcy4gRWFjaCB0eXBlIHNwZWNpZmljLgotCi0JcHVibGljIHZvaWQgc2V0VGVzdENhc2VzKGludFtdIGNhbGxUeXBlcywgT2JqZWN0W10gY2FsbEFyZ3MpIHsKLQkJdGhpcy5jYWxsVHlwZXMgPSBjYWxsVHlwZXM7Ci0JCXRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpc0V4Y2VwdGlvbigpIHRocm93cyBBc3NlcnRpb25GYWlsZWRFcnJvciB7Ci0JCWlmIChleGNlcHRpb24gIT0gbnVsbCkKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpc0NvbXBsZXRlKCkgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yIHsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiRGlkIG5vdCBjb21wbGV0ZSBhbGwgbm90aWZjYXRpb25zLiAiLCBjYWxsVHlwZXMubGVuZ3RoLCBjYWxsSW5kZXggKyAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVJLX0FMTF9TVEFMRSA9IDAsIE1BUktfU1RBTEVfSU5UUk9TUEVDVElPTiA9IDEsIE1BUktfU1RBTEVfSU5UUk9TUEVDVElPTl9QTFVTX0lOTkVSID0gMiwgTUFSS19QQUNLQUdFX1NUQUxFID0gMzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNhbGxUeXBlTmFtZXMgPSBuZXcgU3RyaW5nW10geyAiTUFSS19BTExfU1RBTEUiLCAiTUFSS19TVEFMRV9JTlRST1NQRUNUSU9OIiwgIk1BUktfU1RBTEVfSU5UUk9TUEVDVElPTl9QTFVTX0lOTkVSIiwKLQkJCSJNQVJLX1BBQ0tBR0VfU1RBTEUiLCAKLQkJCSJVTlJFR0lTVEVSX0lOVFJPU1BFQ1RJT04iLCAiVU5SRUdJU1RFUl9JTlRST1NQRUNUSU9OX1BMVVNfSU5ORVIifTsKLQotCS8qCi0JICogVGVzdCB0aGUgbmV4dCBjYWxsIHR5cGUsIGlmIG5vdCB2YWxpZCwgcmV0dXJuIGZhbHNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRlc3RDYWxsVHlwZShpbnQgY2FsbFR5cGUpIHsKLQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBBbHJlYWR5IGhhZCBhbiBlcnJvcgotCQl0cnkgewotCQkJaWYgKCsrY2FsbEluZGV4ID49IGNhbGxUeXBlcy5sZW5ndGgpCi0JCQkJQXNzZXJ0LmZhaWwoIkFuIGV4dHJhIG5vdGlmaWNhdGlvbiBvZiB0eXBlICIgKyBjYWxsVHlwZU5hbWVzW2NhbGxUeXBlXSArICIgcmVjZWl2ZWQuIik7Ci0JCQlpZiAoY2FsbFR5cGVzW2NhbGxJbmRleF0gIT0gY2FsbFR5cGUpCi0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscyhjYWxsVHlwZU5hbWVzW2NhbGxUeXBlc1tjYWxsSW5kZXhdXSwgY2FsbFR5cGVOYW1lc1tjYWxsVHlwZV0pOwotCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQlleGNlcHRpb24gPSBlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvQWRhcHRlckZhY3RvcnkjbWFya0FsbFN0YWxlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrQWxsU3RhbGUoKSB7Ci0JCXRlc3RDYWxsVHlwZShNQVJLX0FMTF9TVEFMRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9BZGFwdGVyRmFjdG9yeSNtYXJrU3RhbGVJbnRyb3NwZWN0aW9uKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgbWFya1N0YWxlSW50cm9zcGVjdGlvbihTdHJpbmcgc291cmNlTmFtZSwgYm9vbGVhbiBjbGVhclJlc3VsdHMpIHsKLQkJaWYgKHRlc3RDYWxsVHlwZShNQVJLX1NUQUxFX0lOVFJPU1BFQ1RJT04pKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMF0sIHNvdXJjZU5hbWUpOwotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKChCb29sZWFuKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVsxXSkuYm9vbGVhblZhbHVlKCksIGNsZWFyUmVzdWx0cyk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvQWRhcHRlckZhY3RvcnkjbWFya1N0YWxlSW50cm9zcGVjdGlvblBsdXNJbm5lcihqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtTdGFsZUludHJvc3BlY3Rpb25QbHVzSW5uZXIoU3RyaW5nIHNvdXJjZU5hbWUsIGJvb2xlYW4gY2xlYXJSZXN1bHRzKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoTUFSS19TVEFMRV9JTlRST1NQRUNUSU9OX1BMVVNfSU5ORVIpKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMF0sIHNvdXJjZU5hbWUpOwotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKChCb29sZWFuKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVsxXSkuYm9vbGVhblZhbHVlKCksIGNsZWFyUmVzdWx0cyk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9BZGFwdGVyRmFjdG9yeSNtYXJrUGFja2FnZVN0YWxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgbWFya1BhY2thZ2VTdGFsZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJaWYgKHRlc3RDYWxsVHlwZShNQVJLX1BBQ0tBR0VfU1RBTEUpKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMF0sIHBhY2thZ2VOYW1lKTsKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9CQkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0SkVNLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0SkVNLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjUwMDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvVGVzdEpFTS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVGVzdEpFTS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA2LzA5LzE4IDIyOjE4OjAyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXI7Ci0gCi0KLS8qKgotICogVGhpcyBpcyBmb3IgdGVzdGluZyB0aGUgSkVNIFJlZmxlY3Rpb24gbGlzdGVuZXJzCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RKRU0gZXh0ZW5kcyBUZXN0TGlzdGVuZXJzIHsKLQkKLQlKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplciBzeW5jOwotCVRlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZhY3RvcnkgPSBuZXcgVGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkoKTsJLy8gTmVlZHMgdG8gYmUgc2V0IGZpcnN0IHNvIHRoYXQgc3VwZXIuc2V0VVAoKSBjYWxscyB0byBzcGVjaWFsIHNldHVwcyB3aWxsIGhhdmUgYSBmYWN0b3J5LgotCQlzdXBlci5zZXRVcCgpOwkvLyBDYWxsZWQgZmlyc3Qgc28gdGhhdCBhbnkgc2V0dXAgd29uJ3QgZmlyZSBvdXIgc3luY2hyb25pemVyLgotCQkKLQkJLy8gQmFzaWMgZm9yIHRoaXMgaXMgYWRkIG91ciBzcGVjaWFsIGxpc3RlbmVyLiAoRG9uJ3QgbmVlZCBmdWxsIEpFTSBtb2RlbCBjbHV0dGVyaW5nIHRoaW5ncyB1cCkuCQkKLQkJZmFjdG9yeS5zZXRKYXZhUHJvamVjdChqcCk7Ci0JCXN5bmMgPSBmYWN0b3J5LmdldFN5bmNocm9uaXplcigpOwotCQlzZXRUZXN0ZXIoZmFjdG9yeSk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwQ2xvc2UoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwQ2xvc2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBDbG9zZSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50WzBdLCBuZXcgT2JqZWN0WzBdKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBPcGVuKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcE9wZW4oKSB7Ci0JCXN1cGVyLnNldFVwT3BlbigpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50WzBdLCBuZXcgT2JqZWN0WzBdKTsJCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcEFkZE1ldGhvZEluV29ya2luZ0NvcHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwQWRkTWV0aG9kSW5Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcEFkZE1ldGhvZEluV29ya2luZ0NvcHkoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFswXSwgbmV3IE9iamVjdFswXSk7CQkKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBTYXZlRnJvbVdvcmtpbmdDb3B5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcFNhdmVGcm9tV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBTYXZlRnJvbVdvcmtpbmdDb3B5KCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuRkxVU0hfUkVGTEVDVElPTl9QTFVTX0lOTkVSX05PX05PVElGSUNBVElPTn0sIG5ldyBPYmplY3RbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5UZXN0MUNsYXNzIn0pOyAJCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcFJldmVydCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBSZXZlcnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBSZXZlcnQoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFswXSwgbmV3IE9iamVjdFswXSk7CQkKLQl9Ci0JCi0vLwkvKiAobm9uLUphdmFkb2MpCi0vLwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldHVwRGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weSgpCi0vLwkgKi8KLS8vCXByb3RlY3RlZCB2b2lkIHNldHVwRGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotLy8JCXN1cGVyLnNldHVwRGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weSgpOwotLy8JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuRkxVU0hfUkVGTEVDVElPTl9OT19OT1RJRklDQVRJT04sIFRlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LkZMVVNIX1JFRkxFQ1RJT05fUExVU19JTk5FUl9OT19OT1RJRklDQVRJT059LCBuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uVGVzdDFDbGFzcyIsICJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uVGVzdDFDbGFzcyJ9KTsJCQotLy8JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldHVwQWRkQ2xhc3MoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQWRkQ2xhc3MoKSB7Ci0JCXN1cGVyLnNldHVwQWRkQ2xhc3MoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeS5ESVNBU1NPQ0lBVEVfU09VUkNFX1BMVVNfSU5ORVJfTk9USUZZfSwgbmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uTmV3Q2xhc3MiLCBCb29sZWFuLkZBTFNFfX0pOwkJCQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0dXBEZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXR1cERlbGV0ZUNsYXNzV2l0aFdvcmtpbmdDb3B5KCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuRkxVU0hfUkVGTEVDVElPTl9QTFVTX0lOTkVSX05PX05PVElGSUNBVElPTiwgVGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuRElTQVNTT0NJQVRFX1NPVVJDRV9QTFVTX0lOTkVSX05PVElGWX0sIG5ldyBPYmplY3RbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5OZXdDbGFzcyIsIG5ldyBPYmplY3RbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5OZXdDbGFzcyIsIEJvb2xlYW4uRkFMU0V9fSk7CQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBEZWxldGVDbGFzc05vV29ya2luZ0NvcHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuRElTQVNTT0NJQVRFX1NPVVJDRV9QTFVTX0lOTkVSX05PVElGWX0sIG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLk5ld0NsYXNzIiwgQm9vbGVhbi5GQUxTRX19KTsJCQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcEFkZFBhY2thZ2UoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwQWRkUGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcEFkZFBhY2thZ2UoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeS5GTFVTSF9QQUNLQUdFX05PX05PVElGSUNBVElPTn0sIG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdFtdIHsidGVzdCIsIEJvb2xlYW4uRkFMU0V9fSk7CQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBEZWxldGVQYWNrYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcERlbGV0ZVBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBEZWxldGVQYWNrYWdlKCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuRkxVU0hfUEFDS0FHRX0sIG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdFtdIHsidGVzdCIsIEJvb2xlYW4uRkFMU0V9fSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3luYy5zdG9wU3luY2hyb25pemVyKCk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvVGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjJiN2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvVGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBUZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFKRE9NQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXI7Ci0gCi0KLS8qKgotICogQSB0ZXN0IHZlcnNpb24gb2YgdGhpcyBzbyB0aGF0IGl0IHdvcmtzIHdpdGggb3VyIHRlc3QgY2FzZXMgd2l0aG91dCBoYXZpbmcgZnVsbGJsb3duIEpFTSBtb2RlbCB1cCBhbmQgcnVubmluZy4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUxpc3RlbmVyVGVzdGVyIHsKLQkKLQlpbnQgY2FsbEluZGV4ID0gLTE7CS8vIEluZGV4IG9mIGNhbGxzIGludG8gY29udHJvbCBsaXN0LgotCUFzc2VydGlvbkZhaWxlZEVycm9yIGV4Y2VwdGlvbjsgLy8gU2V0IGlmIGV4Y2VwdGlvbiBvY2N1cmVkLgotCQotCXByb3RlY3RlZCBpbnRbXSBjYWxsVHlwZXM7CS8vIE9yZGVyIG9mIHBlcm1pdHRlZCBjYWxsdHlwZXMuIElmIGFueSBjb21lIG91dCBvZiBvcmRlciwgdGhlbiBlcnJvci4KLQlwcm90ZWN0ZWQgT2JqZWN0W10gY2FsbEFyZ3M7CS8vIENvcnJlc3BvbmRpbmcgYXJncyBmb3IgZWFjaCBjYWxsIHR5cGVzLiBFYWNoIHR5cGUgc3BlY2lmaWMuCi0JCi0JcHVibGljIHZvaWQgc2V0VGVzdENhc2VzKGludFtdIGNhbGxUeXBlcywgT2JqZWN0W10gY2FsbEFyZ3MpIHsKLQkJdGhpcy5jYWxsVHlwZXMgPSBjYWxsVHlwZXM7Ci0JCXRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaXNFeGNlcHRpb24oKSB0aHJvd3MgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgewotCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpCi0JCQl0aHJvdyBleGNlcHRpb247Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBpc0NvbXBsZXRlKCkgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yIHsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiRGlkIG5vdCBjb21wbGV0ZSBhbGwgbm90aWZjYXRpb25zLiAiLCBjYWxsVHlwZXMubGVuZ3RoLCBjYWxsSW5kZXgrMSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxVU0hfQUxMID0gMCwgRkxVU0hfQUxMX05PX05PVElGSUNBVElPTiA9IDEsIEZMVVNIX1BBQ0tBR0UgPSAyLCBGTFVTSF9QQUNLQUdFX05PX05PVElGSUNBVElPTiA9IDMsIAotCQlGTFVTSF9SRUZMRUNUSU9OID0gNCwgRkxVU0hfUkVGTEVDVElPTl9OT19OT1RJRklDQVRJT04gPSA1LCBGTFVTSF9SRUZMRUNUSU9OX1BMVVNfSU5ORVJfTk9fTk9USUZJQ0FUSU9OID0gNiwgTk9USUZZX0NPTlRFTlRfQ0hBTkdFRCA9IDcsCi0JCURJU0FTU09DSUFURV9TT1VSQ0VfTk9USUZZID0gOCwgRElTQVNTT0NJQVRFX1NPVVJDRSA9IDksIERJU0FTU09DSUFURV9TT1VSQ0VfUExVU19JTk5FUl9OT1RJRlkgPSAxMCwgRElTQVNTT0NJQVRFX1NPVVJDRV9QTFVTX0lOTkVSID0gMTE7IAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNhbGxUeXBlTmFtZXMgPSBuZXcgU3RyaW5nW10geyJGTFVTSF9BTEwiLCAiRkxVU0hfQUxMX05PX05PVElGSUNBVElPTiIsICJGTFVTSF9QQUNLQUdFIiwgIkZMVVNIX1BBQ0tBR0VfTk9fTk9USUZJQ0FUSU9OIiwgCi0JCQkiRkxVU0hfUkVGTEVDVElPTiIsICJGTFVTSF9SRUZMRUNUSU9OX05PX05PVElGSUNBVElPTiIsICJGTFVTSF9SRUZMRUNUSU9OX1BMVVNfSU5ORVJfTk9fTk9USUZJQ0FUSU9OIiwgIk5PVElGWV9DT05URU5UX0NIQU5HRUQiLAotCQkJIkRJU0FTU09DSUFURV9TT1VSQ0VfTk9USUZZIiwgIkRJU0FTU09DSUFURV9TT1VSQ0UiLCAiRElTQVNTT0NJQVRFX1NPVVJDRV9QTFVTX0lOTkVSX05PVElGWSIsICJESVNBU1NPQ0lBVEVfU09VUkNFX1BMVVNfSU5ORVIifTsJCi0JLyoKLQkgKiBUZXN0IHRoZSBuZXh0IGNhbGwgdHlwZSwgaWYgbm90IHZhbGlkLCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGVzdENhbGxUeXBlKGludCBjYWxsVHlwZSkgewotCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7CS8vIEFscmVhZHkgaGFkIGFuIGVycm9yCi0JCXRyeSB7Ci0JCQlpZiAoKytjYWxsSW5kZXggPj0gY2FsbFR5cGVzLmxlbmd0aCkKLQkJCQlBc3NlcnQuZmFpbCgiQW4gZXh0cmEgbm90aWZpY2F0aW9uIG9mIHR5cGUgIiArIGNhbGxUeXBlTmFtZXNbY2FsbFR5cGVdICsgIiByZWNlaXZlZC4iKTsKLQkJCWlmIChjYWxsVHlwZXNbY2FsbEluZGV4XSAhPSBjYWxsVHlwZSkKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGNhbGxUeXBlTmFtZXNbY2FsbFR5cGVzW2NhbGxJbmRleF1dLCBjYWxsVHlwZU5hbWVzW2NhbGxUeXBlXSk7Ci0JCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkjZmx1c2hBbGwoKQotCSAqLwotCXB1YmxpYyB2b2lkIGZsdXNoQWxsKCkgewotCQl0ZXN0Q2FsbFR5cGUoRkxVU0hfQUxMKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YUpET01BZGFwdGVyRmFjdG9yeSNmbHVzaEFsbE5vTm90aWZpY2F0aW9uKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBmbHVzaEFsbE5vTm90aWZpY2F0aW9uKCkgewotCQl0ZXN0Q2FsbFR5cGUoRkxVU0hfQUxMX05PX05PVElGSUNBVElPTik7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5I2ZsdXNoUGFja2FnZShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGZsdXNoUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gbm9GbHVzaElmU291cmNlRm91bmQpIHsKLQkJaWYgKHRlc3RDYWxsVHlwZShGTFVTSF9QQUNLQUdFKSkgewotCQkJdHJ5IHsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKChTdHJpbmcpICgoT2JqZWN0W10pIGNhbGxBcmdzW2NhbGxJbmRleF0pWzBdLCBwYWNrYWdlTmFtZSk7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoKEJvb2xlYW4pICgoT2JqZWN0W10pIGNhbGxBcmdzW2NhbGxJbmRleF0pWzFdKS5ib29sZWFuVmFsdWUoKSwgbm9GbHVzaElmU291cmNlRm91bmQpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFKRE9NQWRhcHRlckZhY3RvcnkjZmx1c2hQYWNrYWdlTm9Ob3RpZmljYXRpb24oamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgTGlzdCBmbHVzaFBhY2thZ2VOb05vdGlmaWNhdGlvbihTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gbm9GbHVzaElmU291cmNlRm91bmQpIHsKLQkJaWYgKHRlc3RDYWxsVHlwZShGTFVTSF9QQUNLQUdFX05PX05PVElGSUNBVElPTikpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVswXSwgcGFja2FnZU5hbWUpOwotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKChCb29sZWFuKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVsxXSkuYm9vbGVhblZhbHVlKCksIG5vRmx1c2hJZlNvdXJjZUZvdW5kKTsgCi0JCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQkJZXhjZXB0aW9uID0gZTsKLQkJCX0JCQkKLQkJfQkJCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5I2ZsdXNoUmVmbGVjdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGZsdXNoUmVmbGVjdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRkxVU0hfUkVGTEVDVElPTikpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSBjYWxsQXJnc1tjYWxsSW5kZXhdLCBzb3VyY2UpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9CQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YUpET01BZGFwdGVyRmFjdG9yeSNmbHVzaFJlZmxlY3Rpb25Ob05vdGlmaWNhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb24gZmx1c2hSZWZsZWN0aW9uTm9Ob3RpZmljYXRpb24oU3RyaW5nIHNvdXJjZSkgewotCQlpZiAodGVzdENhbGxUeXBlKEZMVVNIX1JFRkxFQ1RJT05fTk9fTk9USUZJQ0FUSU9OKSkgewotCQkJdHJ5IHsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKChTdHJpbmcpIGNhbGxBcmdzW2NhbGxJbmRleF0sIHNvdXJjZSk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFKRE9NQWRhcHRlckZhY3RvcnkjZmx1c2hSZWZsZWN0aW9uUGx1c0lubmVyTm9Ob3RpZmljYXRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uIGZsdXNoUmVmbGVjdGlvblBsdXNJbm5lck5vTm90aWZpY2F0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHRlc3RDYWxsVHlwZShGTFVTSF9SRUZMRUNUSU9OX1BMVVNfSU5ORVJfTk9fTk9USUZJQ0FUSU9OKSkgewotCQkJdHJ5IHsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKChTdHJpbmcpIGNhbGxBcmdzW2NhbGxJbmRleF0sIHNvdXJjZSk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFKRE9NQWRhcHRlckZhY3Rvcnkjbm90aWZ5Q29udGVudENoYW5nZWQob3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDb250ZW50Q2hhbmdlZChJQ29tcGlsYXRpb25Vbml0IHRhcmdldENVKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoTk9USUZZX0NPTlRFTlRfQ0hBTkdFRCkpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSBjYWxsQXJnc1tjYWxsSW5kZXhdLCB0YXJnZXRDVS5nZXRFbGVtZW50TmFtZSgpKTsgCi0JCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQkJZXhjZXB0aW9uID0gZTsKLQkJCX0JCQkKLQkJfQkJCQotCX0KLQkKLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5I2Rpc0Fzc29jaWF0ZVNvdXJjZShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb24gZGlzQXNzb2NpYXRlU291cmNlKFN0cmluZyBzb3VyY2UsIGJvb2xlYW4gZG9Ob3RpZnkpIHsKLQkJaWYgKHRlc3RDYWxsVHlwZShESVNBU1NPQ0lBVEVfU09VUkNFX05PVElGWSkpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVswXSwgc291cmNlKTsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCgoQm9vbGVhbikgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMV0pLmJvb2xlYW5WYWx1ZSgpLCBkb05vdGlmeSk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSNkaXNBc3NvY2lhdGVTb3VyY2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uIGRpc0Fzc29jaWF0ZVNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRElTQVNTT0NJQVRFX1NPVVJDRSkpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSBjYWxsQXJnc1tjYWxsSW5kZXhdLCBzb3VyY2UpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5I2Rpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb24gZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKFN0cmluZyBzb3VyY2UsIGJvb2xlYW4gZG9Ob3RpZnkpIHsKLQkJaWYgKHRlc3RDYWxsVHlwZShESVNBU1NPQ0lBVEVfU09VUkNFX1BMVVNfSU5ORVJfTk9USUZZKSkgewotCQkJdHJ5IHsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKChTdHJpbmcpICgoT2JqZWN0W10pIGNhbGxBcmdzW2NhbGxJbmRleF0pWzBdLCBzb3VyY2UpOwotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKChCb29sZWFuKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVsxXSkuYm9vbGVhblZhbHVlKCksIGRvTm90aWZ5KTsgCi0JCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQkJZXhjZXB0aW9uID0gZTsKLQkJCX0JCQkKLQkJfQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5I2Rpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihTdHJpbmcgc291cmNlKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRElTQVNTT0NJQVRFX1NPVVJDRV9QTFVTX0lOTkVSKSkgewotCQkJdHJ5IHsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKChTdHJpbmcpIGNhbGxBcmdzW2NhbGxJbmRleF0sIHNvdXJjZSk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQotCX0KLQkKLQlwdWJsaWMgSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIgZ2V0U3luY2hyb25pemVyKCkgewotCQlyZXR1cm4gc3luY2hyb25pemVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RMaXN0ZW5lcnMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RMaXN0ZW5lcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ5MzU1Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0TGlzdGVuZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBUZXN0TGlzdGVuZXJzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NTYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFQcm9qZWN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlOwotIAotCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0TGlzdGVuZXJzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByb3RlY3RlZCBJSmF2YVByb2plY3QganA7Ci0KLQkvLyBUaGUgaW5kZXhlcyBvZiB0aGVzZSBsb29rdXBzIGFyZSBmb3VuZCBpbiB0aGUgc2V0dXAgYW5kIHRlYXJkb3duIG1ldGhvZHMuIFRoZXkgbXVzdCBiZSBrZXB0IGluIHN5bmMuCi0JcHJvdGVjdGVkIExpc3Qgc2V0dXBTcGVjaWFscyA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInRlc3RPcGVuIiwgInRlc3RDbG9zZSIsICJ0ZXN0QWRkTWV0aG9kSW5Xb3JrY29weSIsICJ0ZXN0U2F2ZUZyb21Xb3JraW5nQ29weSIsCi0JCQkidGVzdFJldmVydCIsICJ0ZXN0RGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weS1vYnNvbGV0ZSwgcmVtb3ZlZCIsICJ0ZXN0QWRkQ2xhc3MiLCAidGVzdERlbGV0ZUNsYXNzV2l0aFdvcmtpbmdDb3B5IiwKLQkJCSJ0ZXN0RGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5IiwgInRlc3RBZGRQYWNrYWdlIiwgInRlc3REZWxldGVQYWNrYWdlIn0pOwotCQotCXByb3RlY3RlZCBJTGlzdGVuZXJUZXN0ZXIgdGVzdGVyOwotCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWpwID0gSmF2YUNvcmUuY3JlYXRlKEphdmFQcm9qZWN0VXRpbC5nZXRQcm9qZWN0KEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BST0pFQ1QpKTsKLQkJU3RyaW5nIHRlc3RuYW1lID0gZ2V0TmFtZSgpOwotCQlpbnQgaW5kZXggPSBzZXR1cFNwZWNpYWxzLmluZGV4T2YodGVzdG5hbWUpOwotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIDA6Ci0JCQkJc2V0VXBPcGVuKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJc2V0VXBDbG9zZSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXNldFVwQWRkTWV0aG9kSW5Xb3JraW5nQ29weSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJCXNldFVwU2F2ZUZyb21Xb3JraW5nQ29weSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0OgotCQkJCXNldFVwUmV2ZXJ0KCk7Ci0JCQkJYnJlYWs7Ci0vLwkJCWNhc2UgNToKLS8vCQkJCXNldHVwRGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weSgpOwotLy8JCQkJYnJlYWs7Ci0JCQljYXNlIDY6Ci0JCQkJc2V0dXBBZGRDbGFzcygpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA3OgotCQkJCXNldHVwRGVsZXRlQ2xhc3NXaXRoV29ya2luZ0NvcHkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgODoKLQkJCQlzZXRVcERlbGV0ZUNsYXNzTm9Xb3JraW5nQ29weSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA5OgotCQkJCXNldFVwQWRkUGFja2FnZSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMDoKLQkJCQlzZXRVcERlbGV0ZVBhY2thZ2UoKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0ZXN0bmFtZSA9IGdldE5hbWUoKTsKLQkJaW50IGluZGV4ID0gc2V0dXBTcGVjaWFscy5pbmRleE9mKHRlc3RuYW1lKTsKLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSAwOgotCQkJCXRlYXJEb3duT3BlbigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXRlYXJEb3duQ2xvc2UoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQl0ZWFyRG93bkFkZE1ldGhvZEluV29ya2luZ0NvcHkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQl0ZWFyRG93blNhdmVGcm9tV29ya2luZ0NvcHkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQl0ZWFyRG93blJldmVydCgpOwotCQkJCWJyZWFrOwotLy8JCQljYXNlIDU6Ci0vLwkJCQl0ZWFyRG93bkRlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHkoKTsKLS8vCQkJCWJyZWFrOwotCQkJY2FzZSA2OgotCQkJCXRlYXJEb3duQWRkQ2xhc3MoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNzoKLQkJCQl0ZWFyRG93bkRlbGV0ZUNsYXNzV2l0aFdvcmtpbmdDb3B5KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDg6Ci0JCQkJdGVhckRvd25EZWxldGVDbGFzc05vV29ya2luZ0NvcHkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgOToKLQkJCQl0ZWFyRG93bkFkZFBhY2thZ2UoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTA6Ci0JCQkJdGVhckRvd25EZWxldGVQYWNrYWdlKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9CQkKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9CQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZXN0ZXIoSUxpc3RlbmVyVGVzdGVyIHRlc3RlcikgewotCQl0aGlzLnRlc3RlciA9IHRlc3RlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBPcGVuKCkgewkKLQl9CQotCXB1YmxpYyB2b2lkIHRlc3RPcGVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3Qgb3BlbiBhIHdvcmtpbmcgY29weS4KLQkJdGVzdENVID0gKElDb21waWxhdGlvblVuaXQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJvcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdDFDbGFzcy5qYXZhIikpOwotCQl0ZXN0Q1UuYmVjb21lV29ya2luZ0NvcHkobnVsbCwgbnVsbCk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd25PcGVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmICh0ZXN0Q1UgIT0gbnVsbCkKLQkJCXRlc3RDVS5kaXNjYXJkV29ya2luZ0NvcHkoKTsJCQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCB0ZXN0Q1U7Ci0JcHJvdGVjdGVkIHZvaWQgc2V0VXBDbG9zZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0ZXN0Q1UgPSAoSUNvbXBpbGF0aW9uVW5pdCkganAuZmluZEVsZW1lbnQobmV3IFBhdGgoIm9yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0MUNsYXNzLmphdmEiKSk7Ci0JCXRlc3RDVS5iZWNvbWVXb3JraW5nQ29weShudWxsLCBudWxsKTsJCQotCX0JCi0JcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgY2xvc2UgYSB3b3JraW5nIGNvcHkuCi0JCXRlc3RDVS5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLQkJdGVzdGVyLmlzRXhjZXB0aW9uKCk7Ci0JCXRlc3Rlci5pc0NvbXBsZXRlKCk7CS8vIEl0IHNob3VsZCBvZiBiZWVuIGNvbXBsZXRlLgotCX0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bkNsb3NlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmICh0ZXN0Q1UgIT0gbnVsbCkKLQkJCXRlc3RDVS5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBBZGRNZXRob2RJbldvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXRlc3RDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBqcC5maW5kRWxlbWVudChuZXcgUGF0aCgib3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3QxQ2xhc3MuamF2YSIpKTsKLQkJdGVzdENVLmJlY29tZVdvcmtpbmdDb3B5KG51bGwsIG51bGwpOwkJCi0JfQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTWV0aG9kSW5Xb3JrY29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0ZXN0Q1UuZ2V0VHlwZXMoKVswXS5jcmVhdGVNZXRob2QoInByaXZhdGUgdm9pZCBnZXRTb21ldGhpbmcoKSB7fSIsIG51bGwsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl0ZXN0ZXIuaXNFeGNlcHRpb24oKTsKLQkJdGVzdGVyLmlzQ29tcGxldGUoKTsJLy8gSXQgc2hvdWxkIG9mIGJlZW4gY29tcGxldGUuCi0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duQWRkTWV0aG9kSW5Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodGVzdENVICE9IG51bGwpCi0JCQl0ZXN0Q1UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7CQkKLQl9CQotCQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwU2F2ZUZyb21Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0ZXN0Q1UgPSAoSUNvbXBpbGF0aW9uVW5pdCkganAuZmluZEVsZW1lbnQobmV3IFBhdGgoIm9yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0MUNsYXNzLmphdmEiKSk7Ci0JCXRlc3RDVS5iZWNvbWVXb3JraW5nQ29weShudWxsLCBudWxsKTsJCQotCQl0ZXN0Q1UuZ2V0VHlwZXMoKVswXS5jcmVhdGVNZXRob2QoInByaXZhdGUgdm9pZCBnZXRTb21ldGhpbmcoKSB7fSIsIG51bGwsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlRnJvbVdvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXRlc3RDVS5jb21taXRXb3JraW5nQ29weSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJdGVzdGVyLmlzRXhjZXB0aW9uKCk7Ci0JCXRlc3Rlci5pc0NvbXBsZXRlKCk7CS8vIEl0IHNob3VsZCBvZiBiZWVuIGNvbXBsZXRlLgkJCi0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duU2F2ZUZyb21Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodGVzdENVICE9IG51bGwpCi0JCQl0ZXN0Q1UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7CQkJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcFJldmVydCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0ZXN0Q1UgPSAoSUNvbXBpbGF0aW9uVW5pdCkganAuZmluZEVsZW1lbnQobmV3IFBhdGgoIm9yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0MUNsYXNzLmphdmEiKSk7Ci0JCXRlc3RDVS5iZWNvbWVXb3JraW5nQ29weShudWxsLCBudWxsKTsJCQotCQl0ZXN0Q1UuZ2V0VHlwZXMoKVswXS5jcmVhdGVNZXRob2QoInByaXZhdGUgdm9pZCBnZXRTb21ldGhpbmcoKSB7fSIsIG51bGwsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwkJCQkKLQl9CQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGVzdENVLnJlc3RvcmUoKTsKLQkJdGVzdGVyLmlzRXhjZXB0aW9uKCk7Ci0JCXRlc3Rlci5pc0NvbXBsZXRlKCk7CS8vIEl0IHNob3VsZCBvZiBiZWVuIGNvbXBsZXRlLgkJCi0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duUmV2ZXJ0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmICh0ZXN0Q1UgIT0gbnVsbCkKLQkJCXRlc3RDVS5kaXNjYXJkV29ya2luZ0NvcHkoKTsJCQkJCi0JfQotCQotLy8gV2l0aCAzLjJNNiBkZWxldGUgd2l0aCBubyB3b3JraW5nIGNvcHkgZ290IHdheSB0byBjb21wbGV4LiBEb2luZyB0aGlzIHRocm91Z2ggcmVmYWN0b3JpbmcgYW5kIG90aGVyIHN0dWZmLiBKdXN0IHRvbyBjb21wbGljYXRlZAotLy8gdG8gZXZlbiB0cnkgdG8gZmlndXJlIG91dC4gU28ganVzdCBwdWxsaW5nIGl0IG91dC4KLQkKLS8vCXByb3RlY3RlZCB2b2lkIHNldHVwRGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotLy8JCXRlc3RDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBqcC5maW5kRWxlbWVudChuZXcgUGF0aCgib3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3QxQ2xhc3MuamF2YSIpKTsKLS8vCQlJTWV0aG9kIG0gPSB0ZXN0Q1UuZ2V0VHlwZXMoKVswXS5nZXRNZXRob2QoImdldFNvbWV0aGluZyIsIG5ldyBTdHJpbmdbMF0pOwotLy8JCWlmIChtLmV4aXN0cygpKQotLy8JCQltLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLS8vCQl0ZXN0Q1UuZ2V0VHlwZXMoKVswXS5jcmVhdGVNZXRob2QoInByaXZhdGUgdm9pZCBnZXRTb21ldGhpbmcoKSB7fSIsIG51bGwsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwkJCQkJCQotLy8JfQotLy8JcHVibGljIHZvaWQgdGVzdERlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJSmF2YUNvcmUucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQkJCS8vIEFjdHVhbGx5IHRoZXJlIHdpbGwgYmUgYSB3b3JraW5nIGNvcHkuIFRoaXMgaXMgdG8gc2ltdWxhdGUgd2hhdCBkZWxldGUgbWV0aG9kIGZyb20gbWVtYmVyIGxpc3QKLS8vCQkJCS8vIHdpdGggbm8gb3BlbiBlZGl0b3IuIFRoaXMgaXMgZG9uZSBieSBiYXRjaGluZyBldmVyeXRoaW5nIHVwLCBidXQgdGhlcmUgaXMgYSB3b3JraW5nIGNvcHkgY3JlYXRlZC4KLS8vCQkJCS8vIEJ1dCBpdCBjaGFuZ2VzIHRoZSBmaWxlIGRpcmVjdGx5IHRoZW4uIChDb25mdXNpbmcsIG5vPyBCdXQgdGhhdCBpcyB0aGUgd2F5IGl0IGRvZXMgaXQgaW4gSkRUKS4KLS8vCQkJCXRlc3RDVS5iZWNvbWVXb3JraW5nQ29weShudWxsLCBudWxsKTsKLS8vCQkJCUlNZXRob2QgbWV0aG9kID0gdGVzdENVLmdldFR5cGVzKClbMF0uZ2V0TWV0aG9kKCJnZXRTb21ldGhpbmciLCBuZXcgU3RyaW5nW10ge30pOwotLy8JCQkJSUJ1ZmZlciBjdUJ1ZmZlciA9IHRlc3RDVS5nZXRCdWZmZXIoKTsKLS8vCQkJCUlTb3VyY2VSYW5nZSBzciA9IG1ldGhvZC5nZXRTb3VyY2VSYW5nZSgpOwotLy8JCQkJY3VCdWZmZXIucmVwbGFjZShzci5nZXRPZmZzZXQoKSwgc3IuZ2V0TGVuZ3RoKCksIiIpOwotLy8JCQkJY3VCdWZmZXIuc2F2ZShtb25pdG9yLCB0cnVlKTsKLS8vCQkJCXRlc3RDVS5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLS8vCQkJfQotLy8JCX0sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotLy8JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotLy8JCXRlc3Rlci5pc0NvbXBsZXRlKCk7CS8vIEl0IHNob3VsZCBvZiBiZWVuIGNvbXBsZXRlLgkJCQkKLS8vCX0KLS8vCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duRGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotLy8JCWlmICh0ZXN0Q1UgIT0gbnVsbCkKLS8vCQkJdGVzdENVLmRpc2NhcmRXb3JraW5nQ29weSgpOwkJCQkJCQotLy8JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldHVwQWRkQ2xhc3MoKSB7Ci0JCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2xhc3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkganAuZmluZEVsZW1lbnQobmV3IFBhdGgoIm9yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mbyIpKTsKLQkJdGVzdENVID0gcGtnLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiTmV3Q2xhc3MuamF2YSIsICJwdWJsaWMgY2xhc3MgTmV3Q2xhc3Mge30iLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJdGVzdGVyLmlzRXhjZXB0aW9uKCk7Ci0JCXRlc3Rlci5pc0NvbXBsZXRlKCk7CS8vIEl0IHNob3VsZCBvZiBiZWVuIGNvbXBsZXRlLgkJCQkKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd25BZGRDbGFzcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodGVzdENVICE9IG51bGwpIHsKLQkJCXRlc3RDVS5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBqcC5maW5kRWxlbWVudChuZXcgUGF0aCgib3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvIikpOwotCQl0ZXN0Q1UgPSBwa2cuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJOZXdDbGFzcy5qYXZhIiwgInB1YmxpYyBjbGFzcyBOZXdDbGFzcyB7fSIsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl0ZXN0Q1UuYmVjb21lV29ya2luZ0NvcHkobnVsbCwgbnVsbCk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJLy8gTmVlZCB0byBydW4gdGhpcyB3YXkgdG8gc2ltdWxhdGUgd2hhdCBoYXBwZW5zIGZvciByZWFsLgotCQkJCXRlc3RDVS5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmNoZWNrcG9pbnQodHJ1ZSk7Ci0JCQkJdGVzdENVLmRpc2NhcmRXb3JraW5nQ29weSgpOwotCQkJfQotCQl9LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJdGVzdGVyLmlzRXhjZXB0aW9uKCk7Ci0JCXRlc3Rlci5pc0NvbXBsZXRlKCk7CS8vIEl0IHNob3VsZCBvZiBiZWVuIGNvbXBsZXRlLgkKLQkJdGVzdENVID0gbnVsbDsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd25EZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodGVzdENVICE9IG51bGwgJiYgdGVzdENVLmV4aXN0cygpKSB7Ci0JCQl0ZXN0Q1UuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBEZWxldGVDbGFzc05vV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkganAuZmluZEVsZW1lbnQobmV3IFBhdGgoIm9yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mbyIpKTsKLQkJdGVzdENVID0gcGtnLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiTmV3Q2xhc3MuamF2YSIsICJwdWJsaWMgY2xhc3MgTmV3Q2xhc3Mge30iLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXRlc3RDVS5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCi0JCXRlc3RDVSA9IG51bGw7CQkKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd25EZWxldGVDbGFzc05vV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHRlc3RDVSAhPSBudWxsICYmIHRlc3RDVS5leGlzdHMoKSkgewotCQkJdGVzdENVLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQkJCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBBZGRQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKElQYWNrYWdlRnJhZ21lbnQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJ0ZXN0IikpOwotCQlpZiAocGtnICE9IG51bGwpCi0JCQlwa2cuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0ganAuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJvb3RzW2ldLmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgewotCQkJCXJvb3RzW2ldLmNyZWF0ZVBhY2thZ2VGcmFnbWVudCgidGVzdCIsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCQkKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd25BZGRQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKElQYWNrYWdlRnJhZ21lbnQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJ0ZXN0IikpOwotCQlpZiAocGtnICE9IG51bGwpCi0JCQlwa2cuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwkJCi0JfQotCQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IHRlc3RQa2c7Ci0JcHJvdGVjdGVkIHZvaWQgc2V0VXBEZWxldGVQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBqcC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocm9vdHNbaV0uZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSB7Ci0JCQkJdGVzdFBrZyA9IHJvb3RzW2ldLmNyZWF0ZVBhY2thZ2VGcmFnbWVudCgidGVzdCIsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERlbGV0ZVBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGVzdFBrZy5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCQkKLQkJdGVzdFBrZyA9IG51bGw7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duRGVsZXRlUGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodGVzdFBrZyAhPSBudWxsICYmIHRlc3RQa2cuZXhpc3RzKCkpCi0JCQl0ZXN0UGtnLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9BYnN0cmFjdFRlc3RQcm94eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvQWJzdHJhY3RUZXN0UHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0NGIyMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9BYnN0cmFjdFRlc3RQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5OwotLyoKLSAqICAkUkNTZmlsZTogQWJzdHJhY3RUZXN0UHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eUZhY3RvcnlSZWdpc3RyeTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBTdGFuZGFyZCB0eXBlIG9mIFByb3h5IFRlc3RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUZXN0UHJveHkgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JLyoqCi0JICogQGF1dGhvciByaWNoa3VscAotCSAqCi0JICogSW50ZXJmYWNlIGZvciByZWdpc3RyeSBoYW5kbGVyLiBBY3R1YWwgaW1wbGVtZW50YXRpb25zIHdpbGwgcGxhY2UgdGhlaXIKLQkgKiBoYW5kbGVyIGluIHRoZSBmaWVsZCBSRUdJU1RSWV9IQU5ETEVSIHRvIHRoYXQgdGhlIHByb3h5IHRlc3RzIGNhbiBhY2Nlc3MgaXQuIAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgUmVnaXN0cnlIYW5kbGVyIHsKLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIGlzIHRoZSBoYW5kbGVyIHZhbGlkIGFuZCBzZXR1cCBjb3JyZWN0bHkuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCk7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjdXJyZW50IHJlZ2lzdHJ5LCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkuCi0JCSAqIEByZXR1cm4gVGhlIHJlZ2lzdHJ5LiAKLQkJICovCi0JCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQkKLQkJLyoqCi0JCSAqIERlc3Ryb3kgdGhlIGN1cnJlbnQgcmVnaXN0cnkuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkZXN0cm95UmVnaXN0cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSByZWdpc3RyeSBoYW5kbGVyIGZvciBhbGwgQWJzdHJhY3RUZXN0UHJveHkgdGVzdHMgaW4gdGhlIAotCSAqIGdpdmVuIHN1aXRlLgotCSAqIEBwYXJhbSBzdWl0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0UmVnaXN0cnlIYW5kbGVyKFRlc3RTdWl0ZSBzdWl0ZSwgUmVnaXN0cnlIYW5kbGVyIHJlZ2lzdHJ5SGFuZGxlcikgewotCQlFbnVtZXJhdGlvbiB0ZXN0cyA9IHN1aXRlLnRlc3RzKCk7Ci0JCXdoaWxlICh0ZXN0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJVGVzdCB0ZXN0ID0gKFRlc3QpIHRlc3RzLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAodGVzdCBpbnN0YW5jZW9mIEFic3RyYWN0VGVzdFByb3h5KQotCQkJCSgoQWJzdHJhY3RUZXN0UHJveHkpIHRlc3QpLnNldFJlZ2lzdHJ5SGFuZGxlcihyZWdpc3RyeUhhbmRsZXIpOwotCQkJZWxzZSBpZiAodGVzdCBpbnN0YW5jZW9mIFRlc3RTdWl0ZSkKLQkJCQlpbml0UmVnaXN0cnlIYW5kbGVyKChUZXN0U3VpdGUpIHRlc3QsIHJlZ2lzdHJ5SGFuZGxlcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEFic3RyYWN0VGVzdFByb3h5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdFRlc3RQcm94eShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBSZWdpc3RyeUhhbmRsZXIgcmVnaXN0cnlIYW5kbGVyOwotCQotCXByb3RlY3RlZCBQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeTsKLQlwcm90ZWN0ZWQgSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgcHJveHlUeXBlRmFjdG9yeTsKLQlwcm90ZWN0ZWQgSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBwcm94eUZhY3Rvcnk7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0UmVnaXN0cnlIYW5kbGVyKCkpOwotCQlhc3NlcnRUcnVlKCJTdWl0ZSBub3Qgc2V0dXAgY29ycmVjdGx5LiIsIGdldFJlZ2lzdHJ5SGFuZGxlcigpLmlzVmFsaWQoKSk7Ci0JCWNyZWF0ZVJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVnaXN0cnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnlIYW5kbGVyKCkuZ2V0UmVnaXN0cnkoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWdpc3RyeSk7Ci0JCXByb3h5RmFjdG9yeSA9IHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKTsKLQkJcHJveHlUeXBlRmFjdG9yeSA9IHJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVnaXN0cnlIYW5kbGVyKFJlZ2lzdHJ5SGFuZGxlciByZWdpc3RyeUhhbmRsZXIpIHsKLQkJdGhpcy5yZWdpc3RyeUhhbmRsZXIgPSByZWdpc3RyeUhhbmRsZXI7Ci0JfQotCi0JcHVibGljIFJlZ2lzdHJ5SGFuZGxlciBnZXRSZWdpc3RyeUhhbmRsZXIoKSB7Ci0JCXJldHVybiByZWdpc3RyeUhhbmRsZXI7Ci0JfQotCQotCS8qKgotCSAqIFJlY3JlYXRlIHRoZSByZWdpc3RyeS4gVGhpcyBpcyB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhIGNsZWFuIG9uZS4gU2hvdWxkIGJlIHVzZWQgd2l0aCBjYXV0aW9uIGJlY2F1c2UgZXhwZW5zaXZlLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlY3JlYXRlUmVnaXN0cnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWdldFJlZ2lzdHJ5SGFuZGxlcigpLmRlc3Ryb3lSZWdpc3RyeSgpOwotCQljcmVhdGVSZWdpc3RyeSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvRXhwcmVzc2lvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L0V4cHJlc3Npb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZWFmMWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvRXhwcmVzc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogRXhwcmVzc2lvblRlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVTdGFuZGFyZEJlYW5Qcm94eUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS4qOwotIAotLyoqCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwcmVzc2lvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RQcm94eSB7Ci0KLQkvKioKLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJUHJveHlCZWFuVHlwZVByb3h5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCB0aGF0IHByb3h5IGJlYW4gdHlwZSBpcyBmaXJzdCBhbiBleHByZXNzaW9uIHByb3h5IGFuZCBhZnRlciBleHByZXNzaW9uIGV2YWx1YXRpb24gZG9lcyBpdCBiZWNvbWUgYSByZWFsIHByb3h5LiAKLQkJLy8gQ2FuJ3QgdGVzdCB0aGF0IGl0IGRvZXNuJ3QgYmVjb21lIGEgcmVhbCBwcm94eSBiZWZvcmUgZXZhbHVhdGlvbiBiZWNhdXNlIGl0IG1heSBiZWNvbWUgcmVzb2x2ZWQgdW5kZXIgdGhlIGNvdmVycy4gRm9yCi0JCS8vIGV4YW1wbGUgSURFIGV4cHJlc3Npb24gaW1tZWRpYXRlbHkgcmVzb2x2ZXMgaXQuCi0JCS8vCi0JCS8vIEZpcnN0IHdlIG11c3QgbWFrZSBzdXJlIHdlIGhhdmUgYSBjbGVhbiByZWdpc3RyeSBiZWNhdXNlIGl0IGNvdWxkIG9mIGJlZW4gcmVzb2x2ZWQgZnJvbSBhIHByZXZpb3VzIHRlc3QuCi0JCXJlY3JlYXRlUmVnaXN0cnkoKTsKLQkJCi0JCS8vIE5vdyBkbyBhbiBleHByZXNzaW9uIGFuZCBnZXQgYSBwcm94eS4KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJSVByb3h5QmVhblR5cGUgYmVhblR5cGVQcm94eSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShleHAsICJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoYmVhblR5cGVQcm94eSk7Ci0JCWFzc2VydFRydWUoYmVhblR5cGVQcm94eS5pc0V4cHJlc3Npb25Qcm94eSgpKTsKLQkJZmluYWwgSUJlYW5UeXBlUHJveHlbXSByZXNvbHV0aW9uID0gbmV3IElCZWFuVHlwZVByb3h5WzFdOwotCQkoKEV4cHJlc3Npb25Qcm94eSkgYmVhblR5cGVQcm94eSkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlyZXNvbHV0aW9uWzBdID0gKElCZWFuVHlwZVByb3h5KSBldmVudC5nZXRQcm94eSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcHJveHlWb2lkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlmYWlsKCJQcm94eSBzaG91bGQgbm90IGJlIHZvaWQuIik7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwcm94eU5vdFJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlmYWlsKCJQcm94eSBzaG91bGQgb2YgcmVzb2x2ZWQuIik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvbHV0aW9uWzBdKTsKLQkJSUJlYW5UeXBlUHJveHkgYmVhblR5cGVQcm94eTIgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChiZWFuVHlwZVByb3h5Mik7Ci0JCWFzc2VydFRydWUoYmVhblR5cGVQcm94eTIuaXNCZWFuUHJveHkoKSk7Ci0JCWFzc2VydFRydWUoYmVhblR5cGVQcm94eTIuaXNWYWxpZCgpKTsKLQkJYXNzZXJ0U2FtZShiZWFuVHlwZVByb3h5MiwgcmVzb2x1dGlvblswXSk7CS8vIEluIGNhc2Ugb2YgYmVhbnR5cGVzIHdlIHdpbGwgZ2V0IGlkZW50aWNhbCBvbmVzIGJhY2sgKGlkZW50aXR5IG5vdCBqdXN0IGVxdWFscykuCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdElQcm94eU1ldGhvZFByb3h5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCB0aGF0IHByb3h5IG1ldGhvZGUgaXMgZmlyc3QgYW4gZXhwcmVzc2lvbiBwcm94eSBhbmQgYWZ0ZXIgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGRvZXMgaXQgYmVjb21lIGEgcmVhbCBwcm94eS4gCi0JCS8vIENhbid0IHRlc3QgdGhhdCBpdCBkb2Vzbid0IGJlY29tZSBhIHJlYWwgcHJveHkgYmVmb3JlIGV2YWx1YXRpb24gYmVjYXVzZSBpdCBtYXkgYmVjb21lIHJlc29sdmVkIHVuZGVyIHRoZSBjb3ZlcnMuIEZvcgotCQkvLyBleGFtcGxlIElERSBleHByZXNzaW9uIGltbWVkaWF0ZWx5IHJlc29sdmVzIGl0LgotCQkvLwotCQkvLyBGaXJzdCB3ZSBtdXN0IG1ha2Ugc3VyZSB3ZSBoYXZlIGEgY2xlYW4gcmVnaXN0cnkgYmVjYXVzZSBpdCBjb3VsZCBvZiBiZWVuIHJlc29sdmVkIGZyb20gYSBwcmV2aW91cyB0ZXN0LgotCQlyZWNyZWF0ZVJlZ2lzdHJ5KCk7Ci0JCQotCQkvLyBOb3cgZG8gYW4gZXhwcmVzc2lvbiBhbmQgZ2V0IGEgcHJveHkuCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlUHJveHkgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoZXhwLCAidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOwotCQlJUHJveHlNZXRob2QgbWV0aG9kUHJveHkgPSBiZWFuVHlwZVByb3h5LmdldE1ldGhvZFByb3h5KGV4cCwgInh5eiIpOwotCQlhc3NlcnROb3ROdWxsKG1ldGhvZFByb3h5KTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RQcm94eS5pc0V4cHJlc3Npb25Qcm94eSgpKTsKLQkJZmluYWwgSU1ldGhvZFByb3h5W10gcmVzb2x1dGlvbiA9IG5ldyBJTWV0aG9kUHJveHlbMV07Ci0JCWZpbmFsIGJvb2xlYW5bXSB3YXNWb2lkID0gbmV3IGJvb2xlYW5bMV07Ci0JCSgoRXhwcmVzc2lvblByb3h5KSBtZXRob2RQcm94eSkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlyZXNvbHV0aW9uWzBdID0gKElNZXRob2RQcm94eSkgZXZlbnQuZ2V0UHJveHkoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJd2FzVm9pZFswXSA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwcm94eU5vdFJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JCUlQcm94eU1ldGhvZCBtZXRob2RQcm94eTIgPSBiZWFuVHlwZVByb3h5LmdldE1ldGhvZFByb3h5KGV4cCwgInh5eiIpOwotCQlhc3NlcnRTYW1lKG1ldGhvZFByb3h5LCBtZXRob2RQcm94eTIpOwkvLyBJdCBzaG91bGQgcmV0dXJuIHNhbWUgZXhwcmVzc2lvbiBwcm94eSBlYWNoIHRpbWUuCi0JCQotCQlleHAuY3JlYXRlTWV0aG9kSW52b2NhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBtZXRob2RQcm94eSwgdHJ1ZSwgMCk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfUkVDRUlWRVIsIGJlYW5UeXBlUHJveHksIDApOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0RmFsc2Uod2FzVm9pZFswXSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb2x1dGlvblswXSk7Ci0JCUlNZXRob2RQcm94eSBtZXRob2RQcm94eTMgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKS5nZXRNZXRob2RQcm94eSgieHl6Iik7Ci0JCWFzc2VydE5vdE51bGwobWV0aG9kUHJveHkzKTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RQcm94eTMuaXNCZWFuUHJveHkoKSk7Ci0JCWFzc2VydFRydWUobWV0aG9kUHJveHkzLmlzVmFsaWQoKSk7Ci0JCS8vIENhbid0IHRlc3QgaWRlbnRpdHkgb2YgbWV0aG9kcHJveGllcyBiZWNhdXNlIHNvbWUgcmVnaXN0cmllcyAoSURFIGZvciBleGFtcGxlKSBjcmVhdGUgYSBuZXcgbWV0aG9kIHByb3h5IGVhY2ggdGltZS4KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SVByb3h5RmllbGRQcm94eSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgdGhhdCBwcm94eSBmaWVsZCBpcyBmaXJzdCBhbiBleHByZXNzaW9uIHByb3h5IGFuZCBhZnRlciBleHByZXNzaW9uIGV2YWx1YXRpb24gZG9lcyBpdCBiZWNvbWUgYSByZWFsIHByb3h5LiAKLQkJLy8gQ2FuJ3QgdGVzdCB0aGF0IGl0IGRvZXNuJ3QgYmVjb21lIGEgcmVhbCBwcm94eSBiZWZvcmUgZXZhbHVhdGlvbiBiZWNhdXNlIGl0IG1heSBiZWNvbWUgcmVzb2x2ZWQgdW5kZXIgdGhlIGNvdmVycy4gRm9yCi0JCS8vIGV4YW1wbGUgSURFIGV4cHJlc3Npb24gaW1tZWRpYXRlbHkgcmVzb2x2ZXMgaXQuCi0JCS8vCi0JCS8vIEZpcnN0IHdlIG11c3QgbWFrZSBzdXJlIHdlIGhhdmUgYSBjbGVhbiByZWdpc3RyeSBiZWNhdXNlIGl0IGNvdWxkIG9mIGJlZW4gcmVzb2x2ZWQgZnJvbSBhIHByZXZpb3VzIHRlc3QuCi0JCXJlY3JlYXRlUmVnaXN0cnkoKTsKLQkJCi0JCS8vIE5vdyBkbyBhbiBleHByZXNzaW9uIGFuZCBnZXQgYSBwcm94eS4KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJSVByb3h5QmVhblR5cGUgYmVhblR5cGVQcm94eSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShleHAsICJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7Ci0JCUlQcm94eUZpZWxkIGZpZWxkUHJveHkgPSBiZWFuVHlwZVByb3h5LmdldEZpZWxkUHJveHkoZXhwLCAiU1RBVElDX0ZJRUxEIik7Ci0JCWFzc2VydE5vdE51bGwoZmllbGRQcm94eSk7Ci0JCWFzc2VydFRydWUoZmllbGRQcm94eS5pc0V4cHJlc3Npb25Qcm94eSgpKTsKLQkJZmluYWwgSUZpZWxkUHJveHlbXSByZXNvbHV0aW9uID0gbmV3IElGaWVsZFByb3h5WzFdOwotCQlmaW5hbCBib29sZWFuW10gd2FzVm9pZCA9IG5ldyBib29sZWFuWzFdOwotCQkoKEV4cHJlc3Npb25Qcm94eSkgZmllbGRQcm94eSkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlyZXNvbHV0aW9uWzBdID0gKElGaWVsZFByb3h5KSBldmVudC5nZXRQcm94eSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcHJveHlWb2lkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQl3YXNWb2lkWzBdID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQkJCi0JCUlQcm94eUZpZWxkIGZpZWxkUHJveHkyID0gYmVhblR5cGVQcm94eS5nZXRGaWVsZFByb3h5KGV4cCwgIlNUQVRJQ19GSUVMRCIpOwotCQlhc3NlcnRTYW1lKGZpZWxkUHJveHksIGZpZWxkUHJveHkyKTsJLy8gSXQgc2hvdWxkIHJldHVybiBzYW1lIGV4cHJlc3Npb24gcHJveHkgZWFjaCB0aW1lLgotCQkKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIGZpZWxkUHJveHksIHRydWUpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsIGJlYW5UeXBlUHJveHksIDApOwotCQlJQmVhblByb3h5IHYgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwodik7Ci0JCWFzc2VydEVxdWFscygzLCAoKElJbnRlZ2VyQmVhblByb3h5KSB2KS5pbnRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydEZhbHNlKHdhc1ZvaWRbMF0pOwotCQlhc3NlcnROb3ROdWxsKHJlc29sdXRpb25bMF0pOwotCQlJRmllbGRQcm94eSBmaWVsZFByb3h5MyA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpLmdldEZpZWxkUHJveHkoIlNUQVRJQ19GSUVMRCIpOwotCQlhc3NlcnROb3ROdWxsKGZpZWxkUHJveHkzKTsKLQkJYXNzZXJ0VHJ1ZShmaWVsZFByb3h5My5pc0JlYW5Qcm94eSgpKTsKLQkJYXNzZXJ0VHJ1ZShmaWVsZFByb3h5My5pc1ZhbGlkKCkpOwotCQkvLyBDYW4ndCB0ZXN0IGlkZW50aXR5IG9mIG1ldGhvZHByb3hpZXMgYmVjYXVzZSBzb21lIHJlZ2lzdHJpZXMgKElERSBmb3IgZXhhbXBsZSkgY3JlYXRlIGEgbmV3IG1ldGhvZCBwcm94eSBlYWNoIHRpbWUuCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhc3RTdHJpbmdUeXBlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNhc3RFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJzaG9ydCIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNBU1RfRVhQUkVTU0lPTiwgMTBsKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKChzaG9ydCkgMTAsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5zaG9ydFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzdFByb3h5VHlwZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDYXN0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInNob3J0IikpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNBU1RfRVhQUkVTU0lPTiwgJ2EnKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKChzaG9ydCkgJ2EnLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuc2hvcnRWYWx1ZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYXN0RXJyb3IoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ2FzdEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJzaG9ydCIpKTsKLQkJdHJ5IHsKLQkJCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DQVNUX0VYUFJFU1NJT04sIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKEJvb2xlYW4uVFJVRSkpOwotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG9mIHRocm93biBDbGFzc0Nhc3RFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJaWYgKCFlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkuZXF1YWxzKCJqYXZhLmxhbmcuQ2xhc3NDYXN0RXhjZXB0aW9uIikpCi0JCQkJdGhyb3cgZTsJLy8gU29tZSBvdGhlciBleGNlcHRpb24sIHJldGhyb3cgaXQuCi0JCX0KLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYXN0RmFpbGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNhc3RFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgic2hvcnQiKSk7Ci0JCXRyeSB7Ci0JCQlleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCQlmYWlsKCJTaG91bGQgb2YgZ290dG9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGcm9tIHRlc3RDYXN0RmFpbGVkIChUaGlzIGlzIHN1Y2Nlc3NmdWwpOiAiK2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbmNlb2ZTdHJpbmdUeXBlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluc3RhbmNlb2ZFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0JCWV4cC5jcmVhdGVTdHJpbmdMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5TVEFOQ0VPRl9WQUxVRSwgImFzZGYiKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZW9mUHJveHlUeXBlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluc3RhbmNlb2ZFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlN0cmluZyIpKTsKLQkJZXhwLmNyZWF0ZVN0cmluZ0xpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTlNUQU5DRU9GX1ZBTFVFLCAiYXNkZiIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZW9mRmFpbGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluc3RhbmNlb2ZFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlN0cmluZyIpKTsKLQkJdHJ5IHsKLQkJCWV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJCWZhaWwoIlNob3VsZCBvZiBnb3R0b24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZyb20gdGVzdEluc3RhbmNlb2ZGYWlsZWQgKFRoaXMgaXMgc3VjY2Vzc2Z1bCk6ICIrZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVR5cGVMaXRlcmFsKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBiZWFuIHR5cGUgcHJveHkuIiwgcmVzdWx0IGluc3RhbmNlb2YgSUJlYW5UeXBlUHJveHkpOwotCQlJQmVhblR5cGVQcm94eSB0eXBlID0gKElCZWFuVHlwZVByb3h5KSByZXN1bHQ7Ci0JCWFzc2VydFRydWUoIk5vdCB2YWxpZC4iLCB0eXBlLmlzVmFsaWQoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHR5cGUuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGVGYWlscygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCXRyeSB7Ci0JCQlleHAuY3JlYXRlVHlwZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImphdmEubGFuZy5TdG5nIik7Ci0JCQlleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCQlmYWlsKCJTaG91bGQgbm90IG9mIGdvdHRvbiBhIHJlc3VsdC4iKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsIGUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5lc3RpbmcoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5zdGFuY2VvZkV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgInNob3J0Iik7Ci0JCWV4cC5jcmVhdGVDYXN0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklOU1RBTkNFT0ZfVkFMVUUsICJzaG9ydCIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNBU1RfRVhQUkVTU0lPTiwgKHNob3J0KSAxMCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJlZml4UGx1cygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVQcmVmaXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIFByZWZpeE9wZXJhdG9yLlBSRV9QTFVTKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5QUkVGSVhfT1BFUkFORCwgMTApOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJlZml4TWludXMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlUHJlZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBQcmVmaXhPcGVyYXRvci5QUkVfTUlOVVMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLlBSRUZJWF9PUEVSQU5ELCAxMCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEwLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmVmaXhNaW51c0NoYXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlUHJlZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBQcmVmaXhPcGVyYXRvci5QUkVfTUlOVVMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLlBSRUZJWF9PUEVSQU5ELCAnYScpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0nYScsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZWZpeENvbXBsZW1lbnQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlUHJlZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBQcmVmaXhPcGVyYXRvci5QUkVfQ09NUExFTUVOVCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uUFJFRklYX09QRVJBTkQsIChzaG9ydCkgMTApOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKH4xMCwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJlZml4Tm90KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVByZWZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgUHJlZml4T3BlcmF0b3IuUFJFX05PVCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uUFJFRklYX09QRVJBTkQsIHRydWUpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmVmaXhGYWlsKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVByZWZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgUHJlZml4T3BlcmF0b3IuUFJFX05PVCk7Ci0JCXRyeSB7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLlBSRUZJWF9PUEVSQU5ELCAxMCk7Ci0JCQlleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCQlmYWlsKCJTaG91bGQgb2YgZmFpbGVkLiIpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3Qgd2FzIHN1Y2Nlc3NmdWw6ICIrZS5nZXRQcm94eUxvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUaW1lcygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9USU1FUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDQpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMqNCwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRpbWVzRXh0ZW5kZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fVElNRVMsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgNWQpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCgzKjQqNWQpLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuZG91YmxlVmFsdWUoKSwgMCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaW1lc0V4dGVuZGVkTmVzdGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1RJTUVTLCAxKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIEluZml4T3BlcmF0b3IuSU5fTUlOVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDEwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgNSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCA1ZCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiZG91YmxlIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKCgxMC01KSo0KjVkKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmRvdWJsZVZhbHVlKCksIDApOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0RJVklERSwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQvMiwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERpdmlkZUV4dGVuZGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0RJVklERSwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMTIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgMmQpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCgxMi8zLzJkKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmRvdWJsZVZhbHVlKCksIDApOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtYWluZGVyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1JFTUFJTkRFUiwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQlMywgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbWFpbmRlckV4dGVuZGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1JFTUFJTkRFUiwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMTIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA5KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgMmQpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCgxMiU5JTJkKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmRvdWJsZVZhbHVlKCksIDApOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWludXMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fTUlOVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LTMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNaW51c0V4dGVuZGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAxMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDkpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCAyZCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiZG91YmxlIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKDEyLTktMmQpLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuZG91YmxlVmFsdWUoKSwgMCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMZWZ0U2hpZnQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fTEVGVF9TSElGVCwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQ8PDMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMZWZ0U2hpZnRFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9MRUZUX1NISUZULCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAxMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDkpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoMTI8PDk8PDIpLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJpZ2h0U2hpZnRTaWduZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfU0lHTkVELCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAtMTAwMDAwMDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygtMTAwMDAwMDA+PjMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJpZ2h0U2hpZnRTaWduZWRFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9SSUdIVF9TSElGVF9TSUdORUQsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIC0xMDAwMDAwMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoLTEwMDAwMDAwPj40Pj4yKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCksIDApOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UmlnaHRTaGlmdFVuU2lnbmVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1JJR0hUX1NISUZUX1VOU0lHTkVELCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAtMTAwMDAwMDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygtMTAwMDAwMDA+Pj4zLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSaWdodFNoaWZ0VW5TaWduZWRFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9SSUdIVF9TSElGVF9VTlNJR05FRCwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgLTEwMDAwMDAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIDIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCgtMTAwMDAwMDA+Pj40Pj4+MiksICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpLCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGVzcygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9MRVNTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAtMTAwMDAwMDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEwMDAwMDAwPDMsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMZXNzRXF1YWxzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0xFU1NfRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDM8PTMsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHcmVhdGVyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVIsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIC0xMDAwMDAwMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygtMTAwMDAwMDA+MywgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdyZWF0ZXJFcXVhbHMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fR1JFQVRFUl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMj49MywgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc1ByaW1pdGl2ZXMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzZCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzZD09MywgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3RzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVUeXBlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0JCWV4cC5jcmVhdGVUeXBlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAiamF2YS5sYW5nLlN0cmluZyIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MgPT0gU3RyaW5nLmNsYXNzLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdE5vdEVxdWFsc1ByaW1pdGl2ZXMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fTk9UX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgM2QpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoM2QhPTMsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Tm90RXF1YWxzT2JqZWN0cygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9OT1RfRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVR5cGVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgImphdmEubGFuZy5TdHJpbmciKTsKLQkJZXhwLmNyZWF0ZVR5cGVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcyAhPSBTdHJpbmcuY2xhc3MsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0WE9SKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1hPUiwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgNSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDVeMywgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFhPUkV4dGVuZGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1hPUiwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMjMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA5KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKDIzXjleMiksICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpLCAwKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFuZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9BTkQsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg1JjMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFuZEV4dGVuZGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0FORCwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMTMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAxNSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIDEpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCgxMyY1JjEpLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX09SLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCA1KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNXwyLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPckV4dGVuZGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX09SLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAxMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDYpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoMTN8NnwyKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCksIDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQbHVzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg1KzIsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1c0V4dGVuZGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgMmwpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImxvbmciLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg1KzIrMmwsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1c1N0cmluZ0xlZnQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgiYWJjIikpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFiYyIrMiwgKChJU3RyaW5nQmVhblByb3h5KSByZXN1bHQpLnN0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQbHVzU3RyaW5nUmlnaHQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMik7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoImFiYyIpKTsJCQotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyKyJhYmMiLCAoKElTdHJpbmdCZWFuUHJveHkpIHJlc3VsdCkuc3RyaW5nVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQbHVzU3RyaW5nTGVmdE51bGwoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgiYWJjIikpOwotCQlleHAuY3JlYXRlTnVsbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hUKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFiYyIrbnVsbCwgKChJU3RyaW5nQmVhblByb3h5KSByZXN1bHQpLnN0cmluZ1ZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGx1c1N0cmluZ1JpZ2h0TnVsbCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZU51bGwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZUKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgiYWJjIikpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsKyJhYmMiLCAoKElTdHJpbmdCZWFuUHJveHkpIHJlc3VsdCkuc3RyaW5nVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBsdXNTdHJpbmdMZWZ0Q2hhcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKCJhYmMiKSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsICdhJyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYmMiKydhJywgKChJU3RyaW5nQmVhblByb3h5KSByZXN1bHQpLnN0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQbHVzU3RyaW5nUmlnaHRDaGFyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsICdhJyk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoImFiYyIpKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoJ2EnKyJhYmMiLCAoKElTdHJpbmdCZWFuUHJveHkpIHJlc3VsdCkuc3RyaW5nVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsQW5kKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX0FORCwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHRydWUpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlICYmIHRydWUsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbEFuZEV4dGVuZGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX0FORCwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHRydWUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUgJiYgdHJ1ZSAmJiAoMyA9PSAzKSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsQW5kRmFsc2VMYXN0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX0FORCwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIGZhbHNlKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSAmJiBmYWxzZSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsQW5kRmFsc2VGaXJzdCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9BTkQsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIGZhbHNlKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgdHJ1ZSk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlICYmIHRydWUsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbEFuZEV4dGVuZGVkQW5kRmFsc2VGaXJzdCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9BTkQsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIGZhbHNlKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UgJiYgdHJ1ZSAmJiAoMyA9PSAzKSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsT3IoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfT1IsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIGZhbHNlKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgdHJ1ZSk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlIHx8IHRydWUsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbE9yRXh0ZW5kZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfT1IsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIGZhbHNlKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgZmFsc2UpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlIHx8IGZhbHNlIHx8ICgzID09IDMpLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uYWxPclRydWVGaXJzdCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9PUiwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIGZhbHNlKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSB8fCBmYWxzZSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsT3JFeHRlbmRlZEFuZFRydWVNaWRkbGUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfT1IsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIGZhbHNlKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UgfHwgdHJ1ZSB8fCAoMyA9PSAzKSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5QWNjZXNzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUFycmF5QmVhblByb3h5IGFycmF5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJzaG9ydCIpLCAxKTsKLQkJYXJyYXkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKChzaG9ydCkgMyksIDApOwotCQkKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5QWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIDEpOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfQVJSQVksIGFycmF5KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCwgMCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygic2hvcnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuc2hvcnRWYWx1ZSgpLCAoc2hvcnQpIDMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlBY2Nlc3NTZXQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInNob3J0IiksIDEpOwotCQlhcnJheS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoKHNob3J0KSAzKSwgMCk7Ci0JCQotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVBcnJheUFjY2VzcyhGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfTEVGVCwgMSk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19BUlJBWSwgYXJyYXkpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAoc2hvcnQpIDMzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5zaG9ydFZhbHVlKCksIChzaG9ydCkgMzMpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlBcnJheUFjY2VzcygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlBcnJheUJlYW5Qcm94eSBhcnJheSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgic2hvcnQiKSwgbmV3IGludFtdIHsyLDF9KTsKLQkJYXJyYXkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKChzaG9ydCkgMyksIG5ldyBpbnRbXXsxLDB9KTsKLQkJCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAxKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0FSUkFZLCBhcnJheSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfSU5ERVgsIDEpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoInNob3J0W10iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpQXJyYXlBY2Nlc3NTZXQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInNob3J0IiksIG5ldyBpbnRbXSB7MiwxfSk7Ci0JCWFycmF5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgoc2hvcnQpIDMpLCBuZXcgaW50W117MSwwfSk7Ci0JCQotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVBcnJheUFjY2VzcyhGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfTEVGVCwgMSk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19BUlJBWSwgYXJyYXkpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYLCAxKTsKLQkJSUFycmF5QmVhblByb3h5IG5ld0FycmF5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJzaG9ydCIpLCBuZXcgaW50W10gezN9KTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIG5ld0FycmF5KTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydFtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aUFycmF5QWNjZXNzMSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlBcnJheUJlYW5Qcm94eSBhcnJheSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgic2hvcnQiKSwgbmV3IGludFtdIHsyLDF9KTsKLQkJYXJyYXkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKChzaG9ydCkgMyksIG5ldyBpbnRbXXsxLDB9KTsKLQkJCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAyKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0FSUkFZLCBhcnJheSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfSU5ERVgsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYLCAwKTsJCQotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoInNob3J0IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKHNob3J0KSAzLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuc2hvcnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5Q3JlYXRpb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXSIsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OLCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldExlbmd0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpQXJyYXlDcmVhdGlvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImludFtdW10iLCAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTiwgMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlDUkVBVElPTl9ESU1FTlNJT04sIDQpOwkJCi0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50W11bXSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsICgoSUFycmF5QmVhblByb3h5KSgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldCgwKSkuZ2V0TGVuZ3RoKCkpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlQYXJ0aWFsQXJyYXlDcmVhdGlvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImludFtdW11bXSIsIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OLCAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTiwgNCk7CQkKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXVtdW10iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCAoKElBcnJheUJlYW5Qcm94eSkoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbCgoKElBcnJheUJlYW5Qcm94eSkoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUluaXRpYWxpemVyRW1wdHkoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiaW50W10iLCAwKTsKLQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50W10iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXRMZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUluaXRpYWxpemVyT25lRGltKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImludFtdIiwgMCk7Ci0JCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTiwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50W10iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygzLCAoKElOdW1iZXJCZWFuUHJveHkpICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldCgwKSkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUluaXRpYWxpemVyVHdvRGltRW1wdHkoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiaW50W11bXSIsIDApOwotCQlleHAuY3JlYXRlQXJyYXlJbml0aWFsaXplcigwKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXVtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbml0aWFsaXplclR3b0RpbSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXVtdIiwgMCk7Ci0JCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDEpOwotCQlleHAuY3JlYXRlQXJyYXlJbml0aWFsaXplcigwKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXVtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChJQXJyYXlCZWFuUHJveHkpICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldCgwKSkuZ2V0TGVuZ3RoKCkpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbml0aWFsaXplclR3b0RpbU5vdEVtcHR5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImludFtdW10iLCAwKTsKLQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMik7Ci0JCWV4cC5jcmVhdGVOdWxsKEZvckV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OLCAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT04sIDQpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludFtdW10iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDIsICgoSUFycmF5QmVhblByb3h5KSAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMSkpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsICgoSU51bWJlckJlYW5Qcm94eSkoKElBcnJheUJlYW5Qcm94eSkgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0KDEpKS5nZXQoMSkpLmludFZhbHVlKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUluaXRpYWxpemVyU2hvcnRJbnQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAic2hvcnRbXSIsIDApOwotCQlleHAuY3JlYXRlQXJyYXlJbml0aWFsaXplcigxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT04sIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoInNob3J0W10iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygzLCAoKElOdW1iZXJCZWFuUHJveHkpICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldCgwKSkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25EZWZhdWx0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiamF2YS5sYW5nLk9iamVjdCIsIDApOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25EZWZhdWx0V2l0aEJlYW5UeXBlUHJveHkoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk9iamVjdCIpLCAwKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdENsYXNzSW5zdGFuY2VDcmVhdGlvbk9uZUFyZygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImphdmEubGFuZy5JbnRlZ2VyIiwgMSk7Ci0JCWV4cC5jcmVhdGVTdHJpbmdMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAiMyIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uT25lQXJnV2l0aFByaW1XaWRlbmluZygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImphdmEubGFuZy5TaG9ydCIsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgKGJ5dGUpMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlNob3J0IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKHNob3J0KTMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5zaG9ydFZhbHVlKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdENsYXNzSW5zdGFuY2VDcmVhdGlvbk51bGxBcmcoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJ0ZXN0UGFja2FnZS5UZXN0Q3RvcldpdGhOdWxsIiwgMSk7Ci0JCWV4cC5jcmVhdGVOdWxsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5UKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0UGFja2FnZS5UZXN0Q3RvcldpdGhOdWxsIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdENsYXNzSW5zdGFuY2VDcmVhdGlvbk1pc21hdGNoQXJnKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAidGVzdFBhY2thZ2UuVGVzdEN0b3JXaXRoTnVsbCIsIDEpOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDEpOwotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBvZiBiZWVuIHRocm93bi4iKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uIiwgZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJfQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkQWNjZXNzU3RhdGljKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJSRUQiLCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigiamF2YS5hd3QuQ29sb3IiKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmF3dC5Db2xvciIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJSUJlYW5UeXBlUHJveHkgY29sb3JUeXBlID0gcmVzdWx0LmdldFR5cGVQcm94eSgpOwotCQlJTWV0aG9kUHJveHkgcmVkID0gY29sb3JUeXBlLmdldE1ldGhvZFByb3h5KCJnZXRSZWQiKTsKLQkJSU1ldGhvZFByb3h5IGdyZWVuID0gY29sb3JUeXBlLmdldE1ldGhvZFByb3h5KCJnZXRHcmVlbiIpOwotCQlJTWV0aG9kUHJveHkgYmx1ZSA9IGNvbG9yVHlwZS5nZXRNZXRob2RQcm94eSgiZ2V0Qmx1ZSIpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCAoKElOdW1iZXJCZWFuUHJveHkpIHJlZC5pbnZva2UocmVzdWx0KSkuaW50VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKElOdW1iZXJCZWFuUHJveHkpIGdyZWVuLmludm9rZShyZXN1bHQpKS5pbnRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoSU51bWJlckJlYW5Qcm94eSkgYmx1ZS5pbnZva2UocmVzdWx0KSkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZEFjY2Vzc1NldFN0YXRpYygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9MRUZULCAiU1RBVElDX0ZJRUxEIiwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAyMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMjMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkQWNjZXNzTm9uU3RhdGljKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJ4IiwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUiwgImphdmEuYXd0LlBvaW50IiwgMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkQWNjZXNzU2V0Tm9uU3RhdGljKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX0xFRlQsICJ4IiwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUiwgImphdmEuYXd0LlBvaW50IiwgMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIDIzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyMywgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRBY2Nlc3NTZXROb25TdGF0aWNTaW1wbGUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBGaXJzdCBjcmVhdGUgdXNpbmcgbm9ybWFsIHByb3h5IHN0dWZmLCB0aGVuIHRlc3QgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc29yLgotCQlJQmVhblR5cGVQcm94eSBwb2ludFR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LlBvaW50Iik7Ci0JCUlGaWVsZFByb3h5IHhGaWVsZFByb3h5ID0gcG9pbnRUeXBlLmdldEZpZWxkUHJveHkoIngiKTsKLQkJSUJlYW5Qcm94eSBwb2ludFByb3h5ID0gcG9pbnRUeXBlLmdldENvbnN0cnVjdG9yUHJveHkobmV3IFN0cmluZ1tdIHsiaW50IiwgImludCJ9KS5uZXdJbnN0YW5jZShuZXcgSUJlYW5Qcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgxKSwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMil9KTsKLQkJCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBlcCA9IGV4cC5jcmVhdGVTaW1wbGVGaWVsZFNldCh4RmllbGRQcm94eSwgcG9pbnRQcm94eSwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMjMpLCB0cnVlKTsKLQkJZXAuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcmVzdWx0ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIzLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZEFjY2Vzc05vblN0YXRpY1NpbXBsZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIEZpcnN0IGNyZWF0ZSB1c2luZyBub3JtYWwgcHJveHkgc3R1ZmYsIHRoZW4gdGVzdCB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzb3IuCi0JCUlCZWFuVHlwZVByb3h5IHBvaW50VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUG9pbnQiKTsKLQkJSUZpZWxkUHJveHkgeEZpZWxkUHJveHkgPSBwb2ludFR5cGUuZ2V0RmllbGRQcm94eSgieCIpOwotCQlJQmVhblByb3h5IHBvaW50UHJveHkgPSBwb2ludFR5cGUuZ2V0Q29uc3RydWN0b3JQcm94eShuZXcgU3RyaW5nW10geyJpbnQiLCAiaW50In0pLm5ld0luc3RhbmNlKG5ldyBJQmVhblByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDEpLCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgyKX0pOwotCQkKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwID0gZXhwLmNyZWF0ZVNpbXBsZUZpZWxkQWNjZXNzKHhGaWVsZFByb3h5LCBwb2ludFByb3h5KTsKLQkJZXAuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcmVzdWx0ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDEsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkQWNjZXNzTm9uU3RhdGljV2l0aFByb3h5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUJlYW5UeXBlUHJveHkgcG9pbnRUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Qb2ludCIpOwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgcG9pbnRUeXBlLmdldEZpZWxkUHJveHkoIngiKSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUiwgImphdmEuYXd0LlBvaW50IiwgMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZEFjY2Vzc0ZhaWxXaXRoRXhwcmVzc2lvblByb3h5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJQmVhblR5cGVQcm94eSBwb2ludFR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LlBvaW50Iik7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCXRyeSB7Ci0JCQlleHAuY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgcG9pbnRUeXBlLmdldEZpZWxkUHJveHkoZXhwLCAieiIpLCB0cnVlKTsKLQkJCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUiwgImphdmEuYXd0LlBvaW50IiwgMik7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMSk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMik7Ci0JCQlleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCQlmYWlsKCJTaG91bGQgb2YgaGFkIGV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5Ob1N1Y2hGaWVsZEV4Y2VwdGlvbiIsIGUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSW52b2tlU3RhdGljKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgInZhbHVlT2YiLCB0cnVlLCAxKTsKLQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigiamF2YS5sYW5nLlN0cmluZyIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLk1FVEhPRF9BUkdVTUVOVCwgdHJ1ZSk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgKChJU3RyaW5nQmVhblByb3h5KSByZXN1bHQpLnN0cmluZ1ZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSW52b2tlUHJveHlGYWlsKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlJQmVhblR5cGVQcm94eSBpbnRUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgaW50VHlwZS5nZXRNZXRob2RQcm94eShleHAsICJnb29ibGR5LWdvb2siKSwgdHJ1ZSwgMSk7Ci0JCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX1JFQ0VJVkVSLCBpbnRUeXBlLCAxKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAzKTsKLQkJCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfQVJHVU1FTlQsICJqYXZhLmxhbmcuSW50ZWdlciIsIDEpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDQpOwotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG9mIGdvdHRlbiBleGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uIiwgZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJbnZva2VOb25TdGF0aWMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlTWV0aG9kSW52b2NhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiY29tcGFyZVRvIiwgdHJ1ZSwgMSk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfUkVDRUlWRVIsICJqYXZhLmxhbmcuSW50ZWdlciIsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMyk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfQVJHVU1FTlQsICJqYXZhLmxhbmcuSW50ZWdlciIsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgNCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKCJDb21wYXJlVG8gd2Fzbid0IGxlc3MgdGhhbiAwLiIsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpIDwgMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJbnZva2VOb25TdGF0aWNXaXRoUHJveHkoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJQmVhblR5cGVQcm94eSBpbnRlZ2VyVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKTsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgaW50ZWdlclR5cGUuZ2V0TWV0aG9kUHJveHkoImNvbXBhcmVUbyIsIG5ldyBJQmVhblR5cGVQcm94eVtdIHtpbnRlZ2VyVHlwZX0pLCB0cnVlLCAxKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9SRUNFSVZFUiwgImphdmEubGFuZy5JbnRlZ2VyIiwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAzKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9BUkdVTUVOVCwgImphdmEubGFuZy5JbnRlZ2VyIiwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCA0KTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoIkNvbXBhcmVUbyB3YXNuJ3QgbGVzcyB0aGFuIDAuIiwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkgPCAwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsVHJ1ZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9UUlVFLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFLCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uYWxGYWxzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9UUlVFLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFLCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQ29uZGl0aW9uYWxUcnVlVHJ1ZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9UUlVFKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0NPTkRJVElPTiwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX1RSVUUsIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDQpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfRkFMU0UsIEluZml4T3BlcmF0b3IuSU5fTUlOVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFLCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoOCwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQ29uZGl0aW9uYWxGYWxzZUZhbHNlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0NPTkRJVElPTiwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAyKTsKLQkJZXhwLmNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX1RSVUUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfVFJVRSwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgNCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9GQUxTRSwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfRkFMU0UsIEluZml4T3BlcmF0b3IuSU5fTUlOVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSA1KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Vm9pZFJldHVyblR5cGUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCXRyeSB7Ci0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDMpOwotCQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgImdjIiwgdHJ1ZSwgMCk7Ci0JCQlleHAuY3JlYXRlVHlwZVJlY2VpdmVyKCJqYXZhLmxhbmcuU3lzdGVtIik7Ci0JCQlleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCQlmYWlsKCJTaG91bGQgb2YgcmVjZWl2ZWQgbm8gZXhwcmVzc2lvbiB2YWx1ZSBleGNlcHRpb24uIik7Ci0JCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSAhPSBudWxsKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCB3YXMgc3VjY2Vzc2Z1bDogIitlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFdyb25nUmV0dXJuVHlwZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCXRyeSB7Ci0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDMpOwotCQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgImdldFNlY3VyaXR5TWFuYWdlciIsIHRydWUsIDApOwotCQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigiamF2YS5sYW5nLlN5c3RlbSIpOwotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG9mIHJlY2VpdmVkIGNsYXNzIGNhc3QgcHJveHkgZXhjZXB0aW9uLiIpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlpZiAoIWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSkKLQkJCQl0aHJvdyBlOwkvLyBTb21lIG90aGVyIGV4Y2VwdGlvbiwgcmV0aHJvdyBpdC4KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW52b2tlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImdldFNlY3VyaXR5TWFuYWdlciIsIHRydWUsIDApOwotCQlleHAuY3JlYXRlVHlwZVJlY2VpdmVyKCJqYXZhLmxhbmcuU3lzdGVtIik7Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnZva2VGYWlsKCkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJdHJ5IHsKLQkJCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJnZXRlbnYiLCB0cnVlLCAxKTsKLQkJCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoImphdmEubGFuZy5TeXN0ZW0iKTsKLQkJCWV4cC5jcmVhdGVTdHJpbmdMaXRlcmFsKEZvckV4cHJlc3Npb24uTUVUSE9EX0FSR1VNRU5ULCAieHl6Iik7Ci0JCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlpZiAoIWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5FcnJvciIpKQotCQkJCXRocm93IGU7CS8vIFNvbWUgb3RoZXIgZXhjZXB0aW9uLCByZXRocm93IGl0LgotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NpZ25tZW50KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWZpbmFsIGxvbmdbXSB0aW1lID0gbmV3IGxvbmdbMV07Ci0JCWVwLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCXRpbWVbMF0gPSAoKElOdW1iZXJCZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmxvbmdWYWx1ZSgpOwotCQkJfQotCQl9KTsKLQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAiY3VycmVudFRpbWVNaWxsaXMiLCB0cnVlLCAwKTsKLQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigiamF2YS5sYW5nLlN5c3RlbSIpOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKDBMICE9IHRpbWVbMF0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVhc3NpZ25tZW50KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWZpbmFsIGxvbmdbXSB0aW1lID0gbmV3IGxvbmdbMV07Ci0JCWVwLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCXRpbWVbMF0gPSAoKElOdW1iZXJCZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmxvbmdWYWx1ZSgpOwotCQkJfQotCQl9KTsKLQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAiY3VycmVudFRpbWVNaWxsaXMiLCB0cnVlLCAwKTsKLQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigiamF2YS5sYW5nLlN5c3RlbSIpOwotCQlleHAuY3JlYXRlUHJveHlSZWFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIGVwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAtMjNMKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0RXF1YWxzKC0yM0wsIHRpbWVbMF0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzaWdubWVudFZvaWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlFeHByZXNzaW9uUHJveHkgZXAgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJRXhwcmVzc2lvblZvaWQgZXBsID0gbmV3IEV4cHJlc3Npb25Wb2lkKCk7Ci0JCWVwLmFkZFByb3h5TGlzdGVuZXIoZXBsKTsKLQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAidGVzdFZvaWQiLCB0cnVlLCAwKTsKLQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKGVwbC52b2lkQ2FsbGVkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc2lnbm1lbnROb3QoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0NPTkRJVElPTiwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfVFJVRSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBlcCA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfRkFMU0UpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIGZhbHNlKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGVwbCA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJZXAuYWRkUHJveHlMaXN0ZW5lcihlcGwpOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKGVwbC5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc2lnbm1lbnRMYXRlclVzYWdlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLy8gZXBhcmcgPSAzOwotCQkvLyBlcEludGVnZXIgPSBuZXcgSW50ZWdlcihlcGFyZysxKTsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwQXJnID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7IAotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIDMpOwotCQlFeHByZXNzaW9uUHJveHkgZXBJbnRlZ2VyID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIiksIDEpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgZXBBcmcpOwkvLyBVc2UgbGl0ZXJhbCAzKzEgYXMgdGhlIGFyZ3VtZW50IHRvIHRoaXMuCi0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDEpOyAKLQkJZXBJbnRlZ2VyLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCQotCQkJCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUFkYXB0ZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCgoSU51bWJlckJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuaW50VmFsdWUoKSwgNCk7Ci0JCQl9CQkJCi0JCX0pOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQkKLQkvLyBUT0RPIC0gZm9yIHNvbWUgdW5rbm93biByZWFzb24gdGhpcyB0ZXN0IGNvbnRpbnVlcyB0byBmYWlsIGluIHRoZSBidWlsZCBvbiB0aGUganZlbGludXggbWFjaGluZS4gSXQgc2VlbXMgdG8gaGF2ZQotCS8vIHZlcnkgdmVyeSBwb29yIHBlcmZvcm1hbmNlIG9uIGp2ZWxpbnV4LgotCS8vIElmIHdlIGNhbiBnZXQgaXQgd29ya2luZywgcHV0ICJ0ZXN0IiBvbiB0aGUgZnJvbnQgb2YgdGhlIG1ldGhvZCBuYW1lIGFnYWluIHRvIGdldCBpdCBydW5uaW5nIGFzIGEgdGVzdC4KLQlwdWJsaWMgdm9pZCBFeHByZXNzaW9uUGVyZm9ybWFuY2VTbWFsbCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQkvLyBTbWFsbCBwZXJmb3JtYW5jZSB0ZXN0LiBXZSBhcmUgdGVzdGluZyBhIHNtYWxsIGJhdGNoIG9mIGV4cHJlc3Npb25zIG9uIGVhY2ggcnVuLiBXZSB0aGVuIGF2Zy4gdGhlIHJ1bnMuIFRoaXMgdGVzdHMgbWFueSBzbWFsbAotCQkvLyBleHByZXNzaW9uIHByb2Nlc3NpbmcgcGVyZm9ybWFuY2UuCi0JCSAKLQkJLy8gUHJpbWUgdGhlIHByb3hpZXMgc28gdGhleSBkb24ndCBiZWNvbWUgcGFydCBvZiB0aGUgdGltaW5ncy4KLQkJSUJlYW5UeXBlUHJveHkgcG9pbnRUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Qb2ludCIpOwotCQlJTWV0aG9kUHJveHkgc2V0TG9jYXRpb24gPSBwb2ludFR5cGUuZ2V0TWV0aG9kUHJveHkoInNldExvY2F0aW9uIiwgbmV3IFN0cmluZ1tdIHsiaW50IiwgImludCJ9KTsKLQkJSU1ldGhvZFByb3h5IGdldExvY2F0aW9uID0gcG9pbnRUeXBlLmdldE1ldGhvZFByb3h5KCJnZXRMb2NhdGlvbiIpOwotCQkvLwotCQkvLyBOb3cgZm9yIGp1c3QgYSBzaW1wbGUgb25lIG1ldGhvZCBpbnZvY2F0aW9uIHVzaW5nIG1ldGhvZCBwcm94aWVzIChhbmQgbm90IG1ldGhvZCBsb29rdXAgZWFjaCB0aW1lKSB0aGUgc3RhbmRhcmQgcHJveHkgY2FsbHMKLQkJLy8gd2lsbCBiZWF0IG91dCBleHByZXNzaW9uIHByb2Nlc3NpbmcgZm9yIFJlbW90ZS4gTm90ZSB0aGF0IGlzIG5vdCB0cnVlIG9mIElERSB2bS4gSW4gdGhhdCBjYXNlIHRoZSBzdGFuZGFyZCBwcm94eSBjYWxscwotCQkvLyB3aWxsIEFMV0FZUyBvdXQgcGVyZm9ybSBncmVhdGx5IHRoZSBleHByZXNzaW9uIHByb2Nlc3NlciBiZWNhdXNlIHRoZXJlIGlzIG5vIGxhdGVuY3kgaW4gdGhlIGNvbW11bmljYXRpb25zLiBJdCBpcyBiYXNpY2FsbHkKLQkJLy8gc3RyYWlnaHQgZGlyZWN0IGNhbGxzLiBXaGlsZSBleHByZXNzaW9uIHByb2Nlc3NpbmcgaXMgYWxzbyBkaXJlY3QgY2FsbHMsIHRoZSBjYWxsIHBhdGggaXMgbXVjaCBsYXJnZXIgYmVjYXVzZSBpdCBuZWVkcyB0byAKLQkJLy8gYnVpbGQvbWFpbnRhaW4vZXhlY3V0ZSB0aGUgcHJvY2Vzc2luZyBzdGFjaywgcmF0aGVyIHRoYW4ganVzdCBleGVjdXRlIHRoZSBjb21tYW5kLiAKLQkJLy8KLQkJCi0JCS8vIFRyeSB0byBwcmltZSB0aGUgY29tbXVuaWNhdGlvbiBwdW1wLiBUaGlzIHNlbmRzIGFib3V0IDM2LDAwMCBieXRlcyBvZiBkYXRhLgotCQkvLyBEb2luZyBpdCBoZXJlIG1lYW5zIGxhdGVyIHdoZW4gbmVlZGVkIHRoZSBjb21tdW5pY2F0aW9ucyBjb3N0cyBhcmUgZHJhc3RpY2FsbHkgcmVkdWNlZC4KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJaW50IGkgPTEwMDA7Ci0JCXdoaWxlIChpLS0+MCkgewotCQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgcmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKQotCQkJCQkuZ2V0QmVhblR5cGVQcm94eShleHAsICJqYXZhLmxhbmcuT2JqZWN0IiwgMSksIDApOwotCQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMCk7Ci0JCX0KLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWludCB0aW1lcyA9IDEwMDsJLy8gTnVtYmVyIG9mIHRpbWVzIHRvIHJ1biB0aGUgdGVzdC4KLQkJaW50IGJhdGNoU2l6ZSA9IDEwOwkvLyBTaXplIG9mIGJhdGNoIGZvciBlYWNoIHRlc3QuCQkKLQkJLy8gTm93IGRvIHRoZSBhY3R1YWwgdGVzdC4KLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpID0gdGltZXM7Ci0JCXdoaWxlKGktLT4wKSB7Ci0JCQlleHByZXNzaW9uU2V0dGluZyhwb2ludFR5cGUsIHNldExvY2F0aW9uLCBnZXRMb2NhdGlvbiwgYmF0Y2hTaXplKTsKLQkJfQotCQkKLQkJbG9uZyBleHByZXNzaW9uVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0OwotCQlsb25nIHN0YXJ0Tm9ybWFsID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWkgPSB0aW1lczsKLQkJd2hpbGUoaS0tPjApIHsKLQkJCW5vcm1hbFNldHRpbmcocG9pbnRUeXBlLCBzZXRMb2NhdGlvbiwgZ2V0TG9jYXRpb24sIGJhdGNoU2l6ZSk7Ci0JCX0KLQkJbG9uZyBub3JtYWxUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnROb3JtYWw7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiU21hbGwgQmF0Y2ggcmVzdWx0czogQmF0Y2ggc2l6ZT0iK2JhdGNoU2l6ZSsiIE51bWJlciBvZiBydW5zPSIrdGltZXMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4cHJlc3Npb24gVGltZTogIiArIGV4cHJlc3Npb25UaW1lICsgIiBBdmc6ICIgKyAoZXhwcmVzc2lvblRpbWUvKChkb3VibGUpIHRpbWVzKSkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vcm1hbCBUaW1lOiAiICsgbm9ybWFsVGltZSsgIiBBdmc6ICIgKyAobm9ybWFsVGltZS8oKGRvdWJsZSkgdGltZXMpKSk7Ci0JCWlmIChub3JtYWxUaW1lID09IDApCi0JCQlub3JtYWxUaW1lID0gMTsJLy8gU28gbm8gZGl2aWRlIGJ5IHplcm8uCi0JCWludCBpbXByb3ZlbWVudCA9IChpbnQpICgoMS0oKGRvdWJsZSkgZXhwcmVzc2lvblRpbWUpL25vcm1hbFRpbWUpKjEwMCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSW1wcm92ZW1lbnQgb2YgZXhwcmVzc2lvbiBvdmVyIG5vcm1hbCB0aW1lOiAiK2ltcHJvdmVtZW50KyclJyk7Ci0JCS8vIE5vdGUgdGhhdCB0aGlzIHRlc3QgaXMgbm90IHZhbGlkIGZvciBJREUgYmVjYXVzZSB0aGUgSURFIHdpbGwgYWx3YXlzIGJlIG90aGVyIHdheSBhcm91bmQgYmVjYXVzZQotCQkvLyB0aGVyZSBpcyBubyBsYXRlbmN5IGRlbGF5IHRoZXJlLgotCi0JCWlmICghKHByb3h5RmFjdG9yeSBpbnN0YW5jZW9mIElERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkpCi0JCQlhc3NlcnRUcnVlKCJMZXNzIHRoYW4gMzAlIGltcHJvdmVtZW50OiAiK2ltcHJvdmVtZW50KyclJywgaW1wcm92ZW1lbnQ+PTMwKTsJLy8gV2UgbGlrZSB0aGlzICUuCi0JfQotCi0JLy8gVE9ETyAtIGZvciBzb21lIHVua25vd24gcmVhc29uIHRoaXMgdGVzdCBjb250aW51ZXMgdG8gZmFpbCBpbiB0aGUgYnVpbGQgb24gdGhlIGp2ZWxpbnV4IG1hY2hpbmUuIEl0IHNlZW1zIHRvIGhhdmUKLQkvLyB2ZXJ5IHZlcnkgcG9vciBwZXJmb3JtYW5jZSBvbiBqdmVsaW51eC4KLQkvLyBJZiB3ZSBjYW4gZ2V0IGl0IHdvcmtpbmcsIHB1dCAidGVzdCIgb24gdGhlIGZyb250IG9mIHRoZSBtZXRob2QgbmFtZSBhZ2FpbiB0byBnZXQgaXQgcnVubmluZyBhcyBhIHRlc3QuCi0JcHVibGljIHZvaWQgRXhwcmVzc2lvblBlcmZvcm1hbmNlTGFyZ2UoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJLy8gU21hbGwgcGVyZm9ybWFuY2UgdGVzdC4gV2UgYXJlIHRlc3RpbmcgYSBsYXJnZSBiYXRjaCBvZiBleHByZXNzaW9ucyBvbiBlYWNoIHJ1bi4gV2UgdGhlbiBhdmcuIHRoZSBydW5zLiBUaGlzIHRlc3RzIG1hbnkgbGFyZ2UKLQkJLy8gZXhwcmVzc2lvbiBwcm9jZXNzaW5nIHBlcmZvcm1hbmNlLgotCQkgCi0JCS8vIFByaW1lIHRoZSBwcm94aWVzIHNvIHRoZXkgZG9uJ3QgYmVjb21lIHBhcnQgb2YgdGhlIHRpbWluZ3MuCi0JCUlCZWFuVHlwZVByb3h5IHBvaW50VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUG9pbnQiKTsKLQkJSU1ldGhvZFByb3h5IHNldExvY2F0aW9uID0gcG9pbnRUeXBlLmdldE1ldGhvZFByb3h5KCJzZXRMb2NhdGlvbiIsIG5ldyBTdHJpbmdbXSB7ImludCIsICJpbnQifSk7Ci0JCUlNZXRob2RQcm94eSBnZXRMb2NhdGlvbiA9IHBvaW50VHlwZS5nZXRNZXRob2RQcm94eSgiZ2V0TG9jYXRpb24iKTsKLQkJLy8KLQkJLy8gTm93IGZvciBqdXN0IGEgc2ltcGxlIG9uZSBtZXRob2QgaW52b2NhdGlvbiB1c2luZyBtZXRob2QgcHJveGllcyAoYW5kIG5vdCBtZXRob2QgbG9va3VwIGVhY2ggdGltZSkgdGhlIHN0YW5kYXJkIHByb3h5IGNhbGxzCi0JCS8vIHdpbGwgYmVhdCBvdXQgZXhwcmVzc2lvbiBwcm9jZXNzaW5nIGZvciBSZW1vdGUuIE5vdGUgdGhhdCBpcyBub3QgdHJ1ZSBvZiBJREUgdm0uIEluIHRoYXQgY2FzZSB0aGUgc3RhbmRhcmQgcHJveHkgY2FsbHMKLQkJLy8gd2lsbCBBTFdBWVMgb3V0IHBlcmZvcm0gZ3JlYXRseSB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzZXIgYmVjYXVzZSB0aGVyZSBpcyBubyBsYXRlbmN5IGluIHRoZSBjb21tdW5pY2F0aW9ucy4gSXQgaXMgYmFzaWNhbGx5Ci0JCS8vIHN0cmFpZ2h0IGRpcmVjdCBjYWxscy4gV2hpbGUgZXhwcmVzc2lvbiBwcm9jZXNzaW5nIGlzIGFsc28gZGlyZWN0IGNhbGxzLCB0aGUgY2FsbCBwYXRoIGlzIG11Y2ggbGFyZ2VyIGJlY2F1c2UgaXQgbmVlZHMgdG8gCi0JCS8vIGJ1aWxkL21haW50YWluL2V4ZWN1dGUgdGhlIHByb2Nlc3Npbmcgc3RhY2ssIHJhdGhlciB0aGFuIGp1c3QgZXhlY3V0ZSB0aGUgY29tbWFuZC4gCi0JCS8vCi0JCQotCQkvLyBUcnkgdG8gcHJpbWUgdGhlIGNvbW11bmljYXRpb24gcHVtcC4gVGhpcyBzZW5kcyBhYm91dCAzNiwwMDAgYnl0ZXMgb2YgZGF0YS4KLQkJLy8gRG9pbmcgaXQgaGVyZSBtZWFucyBsYXRlciB3aGVuIG5lZWRlZCB0aGUgY29tbXVuaWNhdGlvbnMgY29zdHMgYXJlIGRyYXN0aWNhbGx5IHJlZHVjZWQuCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWludCBpID0xMDAwOwotCQl3aGlsZSAoaS0tPjApIHsKLQkJCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkKLQkJCQkJLmdldEJlYW5UeXBlUHJveHkoZXhwLCAiamF2YS5sYW5nLk9iamVjdCIsIDEpLCAwKTsKLQkJCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDApOwotCQl9Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlpbnQgdGltZXMgPSAyNTsJLy8gTnVtYmVyIG9mIHRpbWVzIHRvIHJ1biB0aGUgdGVzdC4KLQkJaW50IGJhdGNoU2l6ZSA9IDEwMDsJLy8gU2l6ZSBvZiBiYXRjaCBmb3IgZWFjaCB0ZXN0LgotCQkKLQkJLy8gTm93IGRvIHRoZSBhY3R1YWwgdGVzdC4KLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpID0gdGltZXM7Ci0JCXdoaWxlKGktLT4wKSB7Ci0JCQlleHByZXNzaW9uU2V0dGluZyhwb2ludFR5cGUsIHNldExvY2F0aW9uLCBnZXRMb2NhdGlvbiwgYmF0Y2hTaXplKTsKLQkJfQotCQlsb25nIGV4cHJlc3Npb25UaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnQ7Ci0JCWxvbmcgc3RhcnROb3JtYWwgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaSA9IHRpbWVzOwotCQl3aGlsZShpLS0+MCkgewotCQkJbm9ybWFsU2V0dGluZyhwb2ludFR5cGUsIHNldExvY2F0aW9uLCBnZXRMb2NhdGlvbiwgYmF0Y2hTaXplKTsKLQkJfQotCQlsb25nIG5vcm1hbFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS1zdGFydE5vcm1hbDsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJMYXJnZSBCYXRjaCByZXN1bHRzOiBCYXRjaCBzaXplPSIrYmF0Y2hTaXplKyIgTnVtYmVyIG9mIHJ1bnM9Iit0aW1lcyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRXhwcmVzc2lvbiBUaW1lOiAiICsgZXhwcmVzc2lvblRpbWUgKyAiIEF2ZzogIiArIChleHByZXNzaW9uVGltZS8oKGRvdWJsZSkgdGltZXMpKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTm9ybWFsIFRpbWU6ICIgKyBub3JtYWxUaW1lKyAiIEF2ZzogIiArIChub3JtYWxUaW1lLygoZG91YmxlKSB0aW1lcykpKTsKLQkJaWYgKG5vcm1hbFRpbWUgPT0gMCkKLQkJCW5vcm1hbFRpbWUgPSAxOwkvLyBTbyBubyBkaXZpZGUgYnkgemVyby4KLQkJaW50IGltcHJvdmVtZW50ID0gKGludCkgKCgxLSgoZG91YmxlKSBleHByZXNzaW9uVGltZSkvbm9ybWFsVGltZSkqMTAwKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJJbXByb3ZlbWVudCBvZiBleHByZXNzaW9uIG92ZXIgbm9ybWFsIHRpbWU6ICIraW1wcm92ZW1lbnQrJyUnKTsKLQkJLy8gTm90ZSB0aGF0IHRoaXMgdGVzdCBpcyBub3QgdmFsaWQgZm9yIElERSBiZWNhdXNlIHRoZSBJREUgd2lsbCBhbHdheXMgYmUgb3RoZXIgd2F5IGFyb3VuZCBiZWNhdXNlCi0JCS8vIHRoZXJlIGlzIG5vIGxhdGVuY3kgZGVsYXkgdGhlcmUuCi0JCWlmICghKHByb3h5RmFjdG9yeSBpbnN0YW5jZW9mIElERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkpCi0JCQlhc3NlcnRUcnVlKCJMZXNzIHRoYW4gNzUlIGltcHJvdmVtZW50OiAiK2ltcHJvdmVtZW50KyclJywgaW1wcm92ZW1lbnQ+PTc1KTsJLy8gV2UgbGlrZSB0aGlzICUuCi0JfQotCQotCXByaXZhdGUgdm9pZCBleHByZXNzaW9uU2V0dGluZyhJQmVhblR5cGVQcm94eSBwb2ludFR5cGUsIElNZXRob2RQcm94eSBzZXRMb2NhdGlvbiwgSU1ldGhvZFByb3h5IGdldExvY2F0aW9uLCBpbnQgdGltZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBUaGlzIGlzIHRoZSBzYW1lIGFzIGV4cHJlc3Npb25TZXR0aW5nIGV4Y2VwdCBpdCB1c2VzIHJlZ3VsYXIgcHJveHkgYWNjZXNzIGluc3RlYWQgb2YgZXhwcmVzc2lvbnMuIEl0IHNob3VsZCBiZQotCQkvLyBzbG93ZXIgYmVjYXVzZSBpdCByZXF1aXJlcyBhIHJvdW5kIHRyaXAgZm9yIGVhY2ggYWNjZXNzLiBGb3IgcmVtb3RlIG9ubHkuCi0JCS8vIFRvIGZhY3RvciBvdXQgdGhlIG92ZXJoZWFkIG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzaW5nLCB3ZSB3aWxsIGRvIHRoZSBjcmVhdGUvc2V0L2dldCAxMCB0aW1lcy4KLQkJLy8gUG9pbnQgcCA9IG5ldyBQb2ludCgpOwotCQkvLyBwLnNldExvY2F0aW9uKDMsNCk7Ci0JCS8vIHAuZ2V0TG9jYXRpb24oKTsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lczsgaSsrKSB7Ci0JCQlFeHByZXNzaW9uUHJveHkgZXBQb2ludCA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIHBvaW50VHlwZSwgMCk7Ci0JCQlleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHNldExvY2F0aW9uLCBlcFBvaW50LCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDMpLCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCg0KX0sIGZhbHNlKTsKLQkJCUV4cHJlc3Npb25Qcm94eSBlcExvYyA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UoZ2V0TG9jYXRpb24sIGVwUG9pbnQsIG51bGwsIHRydWUpOwotCQkJZXBMb2MuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblByb3h5LlByb3h5QWRhcHRlcigpKTsgLy8gSnVzdCBoYXZlIGEgbGlzdGVuZXIsIHdlIHdhbnQgdGhlIGNhbGxiYWNrIG92ZXJoZWFkIGFkZGVkIGluLgotCQl9Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vcm1hbFNldHRpbmcoSUJlYW5UeXBlUHJveHkgcG9pbnRUeXBlLCBJTWV0aG9kUHJveHkgc2V0TG9jYXRpb24sIElNZXRob2RQcm94eSBnZXRMb2NhdGlvbiwgaW50IHRpbWVzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJLy8gVGhpcyBpcyB0aGUgc2FtZSBhcyBleHByZXNzaW9uU2V0dGluZyBleGNlcHQgaXQgdXNlcyByZWd1bGFyIHByb3h5IGFjY2VzcyBpbnN0ZWFkIG9mIGV4cHJlc3Npb25zLiBJdCBzaG91bGQgYmUKLQkJLy8gc2xvd2VyIGJlY2F1c2UgaXQgcmVxdWlyZXMgYSByb3VuZCB0cmlwIGZvciBlYWNoIGFjY2Vzcy4KLQkJLy8gVG8gZmFjdG9yIG91dCB0aGUgb3ZlcmhlYWQgb2YgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBleHByZXNzaW9uIHByb2Nlc3NpbmcsIHdlIHdpbGwgZG8gdGhlIGNyZWF0ZS9zZXQvZ2V0IDEwIHRpbWVzLiBUaGlzIGhlcmUgbWF0Y2hlcyB0aGF0LgotCQkvLyBQb2ludCBwID0gbmV3IFBvaW50KCk7Ci0JCS8vIHAuc2V0TG9jYXRpb24oMyw0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lczsgaSsrKSB7Ci0JCQlJQmVhblByb3h5IGVwUG9pbnQgPSBwb2ludFR5cGUubmV3SW5zdGFuY2UoKTsKLQkJCXNldExvY2F0aW9uLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhlcFBvaW50LAluZXcgSUJlYW5Qcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgzKSwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoNCl9KTsKLQkJCWdldExvY2F0aW9uLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhlcFBvaW50KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmxvY2soKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlpbnQgYmxvY2tudW0gPSBleHAuY3JlYXRlQmxvY2tCZWdpbigpOwotCQlFeHByZXNzaW9uUHJveHkgZXBBcmcgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsgCi0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVCbG9ja0JyZWFrKGJsb2NrbnVtKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwQm9vbGVhbiA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCAxKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9BTkQsIDApOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgZXBBcmcpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCB0cnVlKTsKLQkJZXhwLmNyZWF0ZUJsb2NrRW5kKCk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBlcEJvb2xlYW5sID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQllcEJvb2xlYW4uYWRkUHJveHlMaXN0ZW5lcihlcEJvb2xlYW5sKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZShlcEJvb2xlYW5sLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQl9Ci0KLQkvKgotCSAqIEEgcHJveHkgbGlzdGVuZXIgY2xhc3MgZm9yIHRlc3QgcHVycG9zZXMgdGhhdCByZXF1aXJlcyByZXNvbHZlZCBidXQKLQkgKiB3b24ndCBhbGxvdyBub3QgcmVzb2x2ZWQgb3Igdm9pZCByZXNvbHV0aW9uLiBJbXBsaW1lbnQgdGhlIHJlc29sdmVkCi0JICogbWV0aG9kIHRvIHRlc3QgZm9yIHZhbGlkIHZhbHVlcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvblJlc29sdmVkIGltcGxlbWVudHMgRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIgewotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5Tm90UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm94eU5vdFJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoIlByb3h5IG11c3Qgbm90IGJlIHVucmVzb2x2ZWQuIik7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlWb2lkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJveHlWb2lkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoIlByb3h5IG11c3Qgbm90IGJlIHZvaWQgYXNzaWdubWVudC4iKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgY2xhc3MgRXhwcmVzc2lvbk5vdFJlc29sdmVkIGltcGxlbWVudHMgRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIgewotCQlwdWJsaWMgYm9vbGVhbiBub3RSZXNvbHZlZENhbGxlZCA9IGZhbHNlOwotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eU5vdFJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQlub3RSZXNvbHZlZENhbGxlZCA9IHRydWU7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJQcm94eSBzaG91bGQgbm90IG9mIGJlZW4gcmVzb2x2ZWQuIEl0IHNob3VsZCBiZSB1bnJlc29sdmVkLiIpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlWb2lkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJveHlWb2lkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoIlByb3h5IG11c3Qgbm90IGJlIHZvaWQgYXNzaWdubWVudC4gSXQgc2hvdWxkIGJlIHVucmVzb2x2ZWQuIik7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIGNsYXNzIEV4cHJlc3Npb25Wb2lkIGltcGxlbWVudHMgRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIgewotCQlwdWJsaWMgYm9vbGVhbiB2b2lkQ2FsbGVkID0gZmFsc2U7Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5Tm90UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm94eU5vdFJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoIlByb3h5IHNob3VsZCBvZiBiZWVuIHZvaWQgYW5kIG5vdCB1bnJlc29sdmVkLiIpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJZmFpbCgiUHJveHkgc2hvdWxkIG5vdCBvZiBiZWVuIHJlc29sdmVkLCBpdCBzaG91bGQgb2YgYmVlbiB2b2lkLi4iKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5Vm9pZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQl2b2lkQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2hOb1Rocm93KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB4ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpfSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB5UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIoeVByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5MkNhdGNoTm9UaHJvdygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgdHJ5IHsKLQkJICogICAgIHggPSBCb29sZWFuLnZhbHVlT2YodHJ1ZSk7Ci0JCSAqICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogICB9Ci0JCSAqIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkgKiAgIHogPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHhQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkyID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB6UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydFRydWUoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB6UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIoelByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcjIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5Mi5hZGRQcm94eUxpc3RlbmVyKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyKTsKLQkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHlQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh6UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcjIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5MkNhdGNoVGhyb3dUcnkxKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB3ID0gKG51bGwpLmJvb2xlYW5WYWx1ZSgpOwotCQkgKiAgIHRyeSB7Ci0JCSAqICAgICB4ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkgKiAgICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqICAgfQotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgd1Byb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsJCQotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodHJ1ZSl9LCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvblByb3h5IHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5MiA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHdQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl3UHJveHkuYWRkUHJveHlMaXN0ZW5lcih3UHJveHlSZXNvbHZlcik7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHhQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcih4UHJveHlSZXNvbHZlcik7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHlQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcih5UHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIpOwotCQl6UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5Mi5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiwgZXZlbnQuZ2V0UHJveHkoKS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh3UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHlQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeTJDYXRjaFRocm93VHJ5MkNhdGNoKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB0cnkgewotCQkgKiAgICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiAgIH0KLQkJICogICB3ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uUHJveHkgd1Byb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpfSwgdHJ1ZSk7CQkKLQkJRXhwcmVzc2lvblByb3h5IHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5MiA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHhQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcih4UHJveHlSZXNvbHZlcik7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBldmVudC5nZXRQcm94eSgpLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQl9KTsKLQotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7CQkKLQkJd1Byb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRUcnVlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcjIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5Mi5hZGRQcm94eUxpc3RlbmVyKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHpQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl6UHJveHkuYWRkUHJveHlMaXN0ZW5lcih6UHJveHlSZXNvbHZlcik7Ci0JCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcjIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHpQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeTJDYXRjaFRocm93VHJ5MkNhdGNoMSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgdHJ5IHsKLQkJICogICAgIHggPSAobnVsbCkuYm9vbGVhblZhbHVlKCk7Ci0JCSAqICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJICogICAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiAgIH0KLQkJICogICB3ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgaWxsZWdhbEFyZ3VtZW50Q2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvblByb3h5IHdQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwkJCi0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgaWxsZWdhbEFyZ3VtZW50Q2F0Y2hQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIoaWxsZWdhbEFyZ3VtZW50Q2F0Y2hQcm94eVJlc29sdmVyKTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHdQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl3UHJveHkuYWRkUHJveHlMaXN0ZW5lcih3UHJveHlSZXNvbHZlcik7Ci0JCQotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQl6UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoaWxsZWdhbEFyZ3VtZW50Q2F0Y2hQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh5UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUod1Byb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5MkNhdGNoVGhyb3dUcnkyRmluYWxseTJDYXRjaDEoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvKgotCQkgKiB0cnkgewotCQkgKiAgIHRyeSB7Ci0JCSAqICAgICB4ID0gKG51bGwpLmJvb2xlYW5WYWx1ZSgpOwotCQkgKiAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogICB9IGZpbmFsbHkgewotCQkgKiAgICAgdiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqICAgfQotCQkgKiAgIHcgPSBCb29sZWFuLnZhbHVlT2YodHJ1ZSk7Ci0JCSAqIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkgKiAgIHogPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHhQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJib29sZWFuVmFsdWUiKSwgbnVsbCwgbnVsbCwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKTsKLQkJRXhwcmVzc2lvblByb3h5IHZQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uUHJveHkgd1Byb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpfSwgdHJ1ZSk7CQkKLQkJRXhwcmVzc2lvblByb3h5IHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5MiA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHhQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcih4UHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBpbGxlZ2FsQXJndW1lbnRDYXRjaFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCWlsbGVnYWxBcmd1bWVudENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihpbGxlZ2FsQXJndW1lbnRDYXRjaFByb3h5UmVzb2x2ZXIpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB5UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIoeVByb3h5UmVzb2x2ZXIpOwotCQl2UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHdQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl3UHJveHkuYWRkUHJveHlMaXN0ZW5lcih3UHJveHlSZXNvbHZlcik7Ci0JCQotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQl6UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoaWxsZWdhbEFyZ3VtZW50Q2F0Y2hQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh5UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUod1Byb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5MkNhdGNoVGhyb3dUcnkyRmluYWxseTJOb0NhdGNoKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB0cnkgewotCQkgKiAgICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkgKiAgICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqICAgfSBmaW5hbGx5IHsKLQkJICogICAgIHYgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiAgIH0KLQkJICogICB3ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkgKiAgIHogPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHhQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJib29sZWFuVmFsdWUiKSwgbnVsbCwgbnVsbCwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKTsKLQkJRXhwcmVzc2lvblByb3h5IHZQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uUHJveHkgd1Byb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpfSwgdHJ1ZSk7CQkKLQkJRXhwcmVzc2lvblByb3h5IGlsbGVnYWxBcmd1bWVudENhdGNoRXhjZXB0aW9uUHJveHkyID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgaWxsZWdhbEFyZ3VtZW50Q2F0Y2hQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIoaWxsZWdhbEFyZ3VtZW50Q2F0Y2hQcm94eVJlc29sdmVyKTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQkJdlByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB3UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJd1Byb3h5LmFkZFByb3h5TGlzdGVuZXIod1Byb3h5UmVzb2x2ZXIpOwotCQkKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGlsbGVnYWxBcmd1bWVudENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcjIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCWlsbGVnYWxBcmd1bWVudENhdGNoRXhjZXB0aW9uUHJveHkyLmFkZFByb3h5TGlzdGVuZXIoaWxsZWdhbEFyZ3VtZW50Q2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyMik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB6UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIoelByb3h5UmVzb2x2ZXIpOwotCQkKLQkJYm9vbGVhbiBkaWRpdCA9IGZhbHNlOwotCQl0cnkgewotCQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJYXNzZXJ0RXF1YWxzKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiksIGUuZ2V0VHlwZVByb3h5KCkpOwotCQkJZGlkaXQgPSB0cnVlOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGRpZGl0KTsKLQkJYXNzZXJ0VHJ1ZSh4UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoaWxsZWdhbEFyZ3VtZW50Q2F0Y2hQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh5UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUod1Byb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxBcmd1bWVudENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcjIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHpQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcnlDYXRjaFRocm93KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB4ID0gKG51bGwpLmJvb2xlYW5WYWx1ZSgpOwotCQkgKiB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHhQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJib29sZWFuVmFsdWUiKSwgbnVsbCwgbnVsbCwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBudWxsQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwkJCi0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQludWxsQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiwgZXZlbnQuZ2V0UHJveHkoKS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcnlDYXRjaFJldGhyb3coKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvKgotCQkgKiB0cnkgewotCQkgKiAgIHggPSAobnVsbCkuYm9vbGVhblZhbHVlKCk7Ci0JCSAqIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJICogICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogICB0aHJvdyBlOyAvLyBBcyBhIHJldGhyb3cuCi0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHhQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJib29sZWFuVmFsdWUiKSwgbnVsbCwgbnVsbCwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBudWxsQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlUmV0aHJvdygpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwkJCi0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQludWxsQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiwgZXZlbnQuZ2V0UHJveHkoKS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRyeSB7Ci0JCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkJZmFpbCgiU2hvdWxkIG9mIHRocm93biBOUEUuIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiwgZS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJfQotCQlhc3NlcnRUcnVlKHhQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2hFeHBsaWNpdFRocm93KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB4ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkgKiAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHhQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVGhyb3coKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLlRIUk9XX09QRVJBTkQsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiksIDApOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgbnVsbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB6UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRUcnVlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB5UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIoeVByb3h5UmVzb2x2ZXIpOwotCi0JCXpQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQludWxsQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiwgZXZlbnQuZ2V0UHJveHkoKS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcnlDYXRjaDJOb1Rocm93KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB4ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkgKiAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpfSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwkJCi0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRUcnVlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHlQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcih5UHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHpQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl6UHJveHkuYWRkUHJveHlMaXN0ZW5lcih6UHJveHlSZXNvbHZlcik7Ci0JCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh5UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoelByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2gyVGhyb3cxKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB4ID0gKG51bGwpLmJvb2xlYW5WYWx1ZSgpOwotCQkgKiB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkgKiAgIHogPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgbnVsbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwkJCi0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHhQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcih4UHJveHlSZXNvbHZlcik7CQkKLQotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCW51bGxDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBldmVudC5nZXRQcm94eSgpLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB6UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIoelByb3h5UmVzb2x2ZXIpOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHpQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeUNhdGNoMlRocm93MigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJICogICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkgKiAgIHogPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgbnVsbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB6UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7CQkKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsJCQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHlQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcih5UHJveHlSZXNvbHZlcik7Ci0KLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsgCi0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJbnVsbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHhQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh5UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcnlDYXRjaFRocm93RmluYWxseSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkgKiAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9IGZpbmFsbHkgewotCQkgKiAgIGYgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgbnVsbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKTsKLQkJRXhwcmVzc2lvblByb3h5IGZQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsJCQotCQkKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsJCQotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbnVsbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZlByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSh4UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcnlDYXRjaDJUaHJvdzFGaW5hbGx5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB4ID0gKG51bGwpLmJvb2xlYW5WYWx1ZSgpOwotCQkgKiB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkgKiAgIHogPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9IGZpbmFsbHkgewotCQkgKiAgIGYgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgbnVsbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwkJCi0JCWV4cC5jcmVhdGVUcnlGaW5hbGx5Q2xhdXNlKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBmUHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7CQkKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsJCQotCi0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJbnVsbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHpQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl6UHJveHkuYWRkUHJveHlMaXN0ZW5lcih6UHJveHlSZXNvbHZlcik7Ci0JCWZQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJCi0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHpQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcnlDYXRjaDJUaHJvdzJGaW5hbGx5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB4ID0gKG51bGwpLmJvb2xlYW5WYWx1ZSgpOwotCQkgKiB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkgKiAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0gIGZpbmFsbHkgewotCQkgKiAgIGYgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgbnVsbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB6UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7CQkKLQkJZXhwLmNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKTsKLQkJRXhwcmVzc2lvblByb3h5IGZQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsJCQotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwkJCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQotCQl6UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgeyAKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQludWxsQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiwgZXZlbnQuZ2V0UHJveHkoKS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCX0KLQkJfSk7CQotCQkKLQkJZlByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHhQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh5UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RUcnlDYXRjaE5vVGhyb3dGaW5hbGx5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB4ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBmaW5hbGx5IHsKLQkJICogICBmID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpfSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RmluYWxseUNsYXVzZSgpOwotCQlFeHByZXNzaW9uUHJveHkgZlByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB5UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIoeVByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyKTsKLQkJZlByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2gyTm9UaHJvd0ZpbmFsbHkoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvKgotCQkgKiB0cnkgewotCQkgKiAgIHggPSBCb29sZWFuLnZhbHVlT2YodHJ1ZSk7Ci0JCSAqIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkgKiAgIHogPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9IGZpbmFsbHkgewotCQkgKiAgIGYgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodHJ1ZSl9LCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB6UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7CQkKLQkJZXhwLmNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKTsKLQkJRXhwcmVzc2lvblByb3h5IGZQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsJCQotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB5UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIoeVByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB6UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIoelByb3h5UmVzb2x2ZXIpOwotCQlmUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHpQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdElmRWxzZVRydWVXaXRoRWxzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJZkVsc2UodHJ1ZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUV4cHJlc3Npb25Qcm94eSB0cnVlUHJveHkgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX1RSVUUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUV4cHJlc3Npb25Qcm94eSBmYWxzZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9FTFNFKTsJCQotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQkKLQkJdHJ1ZVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCWFzc2VydEVxdWFscygiaW50IiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDYsICgoSU51bWJlckJlYW5Qcm94eSkgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlmYWxzZVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWZFbHNlRmFsc2VXaXRoRWxzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJZkVsc2UodHJ1ZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUV4cHJlc3Npb25Qcm94eSB0cnVlUHJveHkgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX1RSVUUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUV4cHJlc3Npb25Qcm94eSBmYWxzZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9FTFNFKTsJCQotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCi0JCXRydWVQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKSk7Ci0JCQotCQlmYWxzZVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCWFzc2VydEVxdWFscygiaW50IiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDAsICgoSU51bWJlckJlYW5Qcm94eSkgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZkVsc2VUcnVlV2l0aG91dEVsc2UoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSWZFbHNlKGZhbHNlKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX0NPTkRJVElPTiwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJRXhwcmVzc2lvblByb3h5IHRydWVQcm94eSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfVFJVRSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJCi0JCXRydWVQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHZhbHVlID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJCQlhc3NlcnRFcXVhbHMoImludCIsIHZhbHVlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscyg2LCAoKElOdW1iZXJCZWFuUHJveHkpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElmRWxzZUZhbHNlV2l0aG91dEVsc2UoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSWZFbHNlKGZhbHNlKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX0NPTkRJVElPTiwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJRXhwcmVzc2lvblByb3h5IHRydWVQcm94eSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfVFJVRSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJCi0JCXRydWVQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKSk7Ci0KLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWZFbHNlQmxvY2tzVHJ1ZVdpdGhFbHNlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUlmRWxzZSh0cnVlKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX0NPTkRJVElPTiwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUJsb2NrQmVnaW4oKTsKLQkJCUV4cHJlc3Npb25Qcm94eSB0cnVlUHJveHkgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlQmxvY2tFbmQoKTsKLQkJZXhwLmNyZWF0ZUJsb2NrQmVnaW4oKTsKLQkJCUV4cHJlc3Npb25Qcm94eSBmYWxzZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7CQkKLQkJCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUJsb2NrRW5kKCk7Ci0JCQotCQl0cnVlUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSB2YWx1ZSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCB2YWx1ZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoNiwgKChJTnVtYmVyQmVhblByb3h5KSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZhbHNlUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZkVsc2VCbG9ja3NGYWxzZVdpdGhFbHNlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUlmRWxzZSh0cnVlKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX0NPTkRJVElPTiwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUJsb2NrQmVnaW4oKTsKLQkJCUV4cHJlc3Npb25Qcm94eSB0cnVlUHJveHkgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlQmxvY2tFbmQoKTsKLQkJZXhwLmNyZWF0ZUJsb2NrQmVnaW4oKTsKLQkJCUV4cHJlc3Npb25Qcm94eSBmYWxzZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7CQkKLQkJCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUJsb2NrRW5kKCk7Ci0KLQkJdHJ1ZVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpKTsKLQkJCi0JCWZhbHNlUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSB2YWx1ZSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCB2YWx1ZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoMCwgKChJTnVtYmVyQmVhblByb3h5KSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElmRWxzZUJsb2NrVHJ1ZVdpdGhvdXRFbHNlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUlmRWxzZShmYWxzZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0JlZ2luKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgdHJ1ZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUJsb2NrRW5kKCk7Ci0JCQotCQl0cnVlUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSB2YWx1ZSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCB2YWx1ZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoNiwgKChJTnVtYmVyQmVhblByb3h5KSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZkVsc2VCbG9ja0ZhbHNlV2l0aG91dEVsc2UoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSWZFbHNlKGZhbHNlKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX0NPTkRJVElPTiwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUJsb2NrQmVnaW4oKTsKLQkJCUV4cHJlc3Npb25Qcm94eSB0cnVlUHJveHkgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlQmxvY2tFbmQoKTsKLQkJCi0JCXRydWVQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKSk7Ci0KLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0luaXRTdHJpbmdQcmltaXRpdmUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBVc2UgaW50ZXJuYWwgZXhwcmVzc2lvbiBjbGFzcyBzbyB3ZSBjYW4gdGVzdCB0aGUgc3BlY2lhbCBtZXRob2QuCi0JCUV4cHJlc3Npb24gZXhwID0gKEV4cHJlc3Npb24pIHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSByZXN1bHQgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZU5ld0luc3RhbmNlKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgImZhbHNlIiwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJib29sZWFuIikpOwotCQlyZXN1bHQuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCl7Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHZhbHVlID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCB2YWx1ZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoZmFsc2UsICgoSUJvb2xlYW5CZWFuUHJveHkpIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFyaygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIEp1c3QgdGVzdCBoYXZpbmcgYSBtYXJrIGFuZCBubyBlcnJvcnMuCi0JCUV4cHJlc3Npb24gZXhwID0gKEV4cHJlc3Npb24pIHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWludCBtYXJrID0gZXhwLm1hcmsoKTsKLQkJdHJ5IHsKLQkJCUV4cHJlc3Npb25Qcm94eSByZXN1bHQgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCWV4cC5jcmVhdGVOZXdJbnN0YW5jZShGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJCXJlc3VsdC5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKXsKLQkJCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJSUJlYW5Qcm94eSB2YWx1ZSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCB2YWx1ZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCAoKElCb29sZWFuQmVhblByb3h5KSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwkJCQotCQl9IGZpbmFsbHkgewotCQkJZXhwLmVuZE1hcmsobWFyayk7Ci0JCX0KLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXJrMigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIEp1c3QgdGVzdCBoYXZpbmcgYSBtYXJrIGVycm9ycywgYnV0IGV4cHJlc3Npb25zIGJlZm9yZSB0aGUgbWFyayBhbmQgYWZ0ZXIgdGhlIG1hcmsgYXJlIHN1Y2Nlc3NmdWwuCi0JCUV4cHJlc3Npb24gZXhwID0gKEV4cHJlc3Npb24pIHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWludCBtYXJrMCA9IGV4cC5tYXJrKCk7Ci0JCWZpbmFsIGJvb2xlYW5bXSByZXN1bHRSZXNvbHZlZCA9IG5ldyBib29sZWFuWzFdOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgZXAxID0gbnVsbDsKLQkJZmluYWwgYm9vbGVhbltdIHJlc3VsdFJlc29sdmVkMiA9IG5ldyBib29sZWFuWzFdOwotCQl0cnkgewotCQkJRXhwcmVzc2lvblByb3h5IHJlc3VsdCA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJcmVzdWx0LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCQlJQmVhblByb3h5IHZhbHVlID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0JCQkJCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHZhbHVlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCQlhc3NlcnRFcXVhbHMoZmFsc2UsICgoSUJvb2xlYW5CZWFuUHJveHkpIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCXJlc3VsdFJlc29sdmVkWzBdID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCX0pOwotCQkJZXhwLmNyZWF0ZU5ld0luc3RhbmNlKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgImZhbHNlIiwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJib29sZWFuIikpOwotCQkJZXhwLmNyZWF0ZVRyeSgpOwotCQkJaW50IG1hcmsgPSBleHAubWFyaygpOwotCQkJdHJ5IHsKLQkJCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0MSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJCXJlc3VsdDEuYWRkUHJveHlMaXN0ZW5lcihlcDEgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCQkJCWV4cC5jcmVhdGVOZXdJbnN0YW5jZShGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfTEVGVCwgImZhbHNlIiwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJib29sZWFuIikpOwotCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUaGlzIGlzIG9rLCBzaG91bGQgb2YgZ290IHRoaXMuCi0JCQl9IGZpbmFsbHkgewotCQkJCWV4cC5lbmRNYXJrKG1hcmspOwotCQkJfQotCQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQkJRXhwcmVzc2lvblByb3h5IHJlc3VsdDIgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXJlc3VsdDIuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJCWFzc2VydEVxdWFscyhmYWxzZSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJcmVzdWx0UmVzb2x2ZWQyWzBdID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCX0pOwotCQkJZXhwLmNyZWF0ZU5ld0luc3RhbmNlKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgImZhbHNlIiwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJib29sZWFuIikpOwotCQl9IGZpbmFsbHkgewotCQkJZXhwLmVuZE1hcmsobWFyazApOwotCQl9Ci0JCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChlcDEpOwotCQlhc3NlcnRUcnVlKGVwMS5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocmVzdWx0UmVzb2x2ZWRbMF0pOwotCQlhc3NlcnRUcnVlKHJlc3VsdFJlc29sdmVkMlswXSk7Ci0JCQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFya0Vycm9yKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCB3aXRoIG9uZSBlcnJvciBhbmQgc2VlIGlmIGl0IHJlc3RvcmVzIGNvcnJlY3RseS4KLQkJRXhwcmVzc2lvbiBleHAgPSAoRXhwcmVzc2lvbikgcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJaW50IG1hcmsgPSBleHAubWFyaygpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgZXBsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUV4cHJlc3Npb25Qcm94eSByZXN1bHQgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXJlc3VsdC5hZGRQcm94eUxpc3RlbmVyKGVwbCA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKSk7Ci0JCQlleHAuY3JlYXRlTmV3SW5zdGFuY2UoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX0xFRlQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgaXMgZ29vZC4gV2Ugc2hvdWxkIGdldCBoZXJlLgotCQl9IGZpbmFsbHkgewotCQkJZXhwLmVuZE1hcmsobWFyayk7Ci0JCX0KLQkJCi0JCS8vIE5vdyB3ZSBzaG91bGQgYmUgYWJsZSB0byBjb250aW51ZSBhbmQgZ2V0IGdvb2QgYW5zd2VyLgotCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVOZXdJbnN0YW5jZShGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJcmVzdWx0LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSB2YWx1ZSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCAoKElCb29sZWFuQmVhblByb3h5KSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQkJCi0JCX0pOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChlcGwpOwotCQlhc3NlcnRUcnVlKGVwbC5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXJrTmVzdEVycm9yKCkgewotCQkvLyBUZXN0IG1hcmsgbmVzdCBlcnJvci4KLQkJLy8gbWFyawotCQkvLyB0cnkgewotCQkvLyAgIGVuZG1hcmsKLQkJLy8gfSBmaW5hbGx5IDwtLSB0aGlzIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24uCi0JCUV4cHJlc3Npb24gZXhwID0gKEV4cHJlc3Npb24pIHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWludCBtYXJrID0gZXhwLm1hcmsoKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGVwbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlyZXN1bHQuYWRkUHJveHlMaXN0ZW5lcihlcGwgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCQkJZXhwLmNyZWF0ZU5ld0luc3RhbmNlKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgImZhbHNlIiwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJib29sZWFuIikpOwotCQkJZXhwLmVuZE1hcmsobWFyayk7Ci0JCQlleHAuY3JlYXRlVHJ5RmluYWxseUNsYXVzZSgpOwotCQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBnb29kLiBXZSBzaG91bGQgZ2V0IGhlcmUuCi0JCQlleHAuY2xvc2UoKTsKLQkJCWFzc2VydE5vdE51bGwoZXBsKTsKLQkJCWFzc2VydFRydWUoZXBsLm5vdFJlc29sdmVkQ2FsbGVkKTsJCQkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZXhwLmNsb3NlKCk7Ci0JCWZhaWwoIlNob3VsZCBub3Qgb2YgZ290dGVuIGhlcmUuIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXJrTmVzdEVycm9yMigpIHsKLQkJLy8gVGVzdCBtYXJrIG5lc3QgZXJyb3IuCi0JCS8vIHRyeSB7Ci0JCS8vICAgbWFyawotCQkvLyB9IGZpbmFsbHkgPC0tIHRoaXMgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbi4KLQkJLy8gZW5kbWFyawotCQlFeHByZXNzaW9uIGV4cCA9IChFeHByZXNzaW9uKSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgZXBsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWV4cC5jcmVhdGVUcnkoKTsKLQkJCWludCBtYXJrID0gZXhwLm1hcmsoKTsKLQkJCUV4cHJlc3Npb25Qcm94eSByZXN1bHQgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXJlc3VsdC5hZGRQcm94eUxpc3RlbmVyKGVwbCA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKSk7Ci0JCQlleHAuY3JlYXRlTmV3SW5zdGFuY2UoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAiZmFsc2UiLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImJvb2xlYW4iKSk7Ci0JCQlleHAuY3JlYXRlVHJ5RmluYWxseUNsYXVzZSgpOwotCQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQkJZXhwLmVuZE1hcmsobWFyayk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIGlzIGdvb2QuIFdlIHNob3VsZCBnZXQgaGVyZS4KLQkJCWV4cC5jbG9zZSgpOwotCQkJYXNzZXJ0Tm90TnVsbChlcGwpOwotCQkJYXNzZXJ0VHJ1ZShlcGwubm90UmVzb2x2ZWRDYWxsZWQpOwkJCQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlleHAuY2xvc2UoKTsKLQkJZmFpbCgiU2hvdWxkIG5vdCBvZiBnb3R0ZW4gaGVyZS4iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhwcmVzc2lvblRyYW5zZmVyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCS8vIFRlc3QgdGhhdCB0aHJlYWQgdHJhbnNmZXIgd29ya3MuIFdlIHdpbGwgZG8gcGFydCBvZiB0aGUgZXhwcmVzc2lvbiBpbiBvbmUgdGhyZWFkLCBtb3JlIGluIHRoZSBuZXh0LCBhbmQKLQkJLy8gdGhlbiBjb21lIGJhY2sgYW5kIGNvbXBsZXRlIGl0LgotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlFeHByZXNzaW9uUHJveHkgZXBJbmZpeCA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9MRVNTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAtMTAwMDAwMDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJCi0JCS8vIE5vdyB0cmFuc2ZlciB0byBhbm90aGVyIHRocmVhZC4KLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKEV4cHJlc3Npb24pIGV4cDsKLQkJZXhwcmVzc2lvbi5iZWdpblRyYW5zZmVyVGhyZWFkKCk7CS8vIEJlZ2luIHRoZSB0cmFuc2Zlci4KLQkJCi0JCUlCZWFuVHlwZVByb3h5IGNhbGxiYWNrVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LnZtLlRlc3RFeHByZXNzaW9uVGhyZWFkVHJhbnNmZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGNhbGxiYWNrVHlwZSk7Ci0JCUlCZWFuUHJveHkgY2FsbGJhY2tQcm94eSA9IGNhbGxiYWNrVHlwZS5uZXdJbnN0YW5jZSgpOwotCQkKLQkJRXhwcmVzc2lvblRocmVhZFRyYW5zZmVyQ2FsbEJhY2sgY2IgPSBuZXcgRXhwcmVzc2lvblRocmVhZFRyYW5zZmVyQ2FsbEJhY2soZXhwcmVzc2lvbik7Ci0JCXJlZ2lzdHJ5LmdldENhbGxiYWNrUmVnaXN0cnkoKS5yZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrUHJveHksIGNiKTsKLQkJSUludm9rYWJsZSBzdGFydCA9IGNhbGxiYWNrVHlwZS5nZXRJbnZva2FibGUoInN0YXJ0Iik7CS8vJE5PTi1OTFMtMSQKLQkJc3RhcnQuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKGNhbGxiYWNrUHJveHkpOwkvLyBTdGFydCB0aGUgdGhyZWFkIG9uIHRoZSByZW1vdGUgdm0gYW5kIHdhaXQgZm9yIGl0IHRvIGZpbmlzaC4KLQkJCi0JCWVwSW5maXguYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChFeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcmVzdWx0ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscygtMTAwMDAwMDA8MywgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7CQkKLQkJCX0KLQkJfSk7Ci0JCQotCQlpZiAoY2IuZXJyb3IgIT0gbnVsbCkgewotCQkJdGhyb3cgY2IuZXJyb3I7Ci0JCX0KLQkJCi0JCWNiLmVwLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChFeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcmVzdWx0ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MgPT0gU3RyaW5nLmNsYXNzLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZXhwcmVzc2lvbi50cmFuc2ZlclRocmVhZCgpOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3ViZXhwcmVzc2lvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImludFtdW11bXSIsIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OLCAyKTsKLQkJRXhwcmVzc2lvblByb3h5IHNlY29uZERpbWVuc2lvblByb3h5ID0gbnVsbDsKLQkJLy8gVGhpcyB0ZXN0cyB0aGF0IHdlIGNhbiBwdXQgYW4gZXhwcmVzc2lvbiByaWdodCBpbiB0aGUgbWlkZGxlIG9mIGFub3RoZXIgZXhwcmVzc2lvbiBhbmQgCi0JCS8vIHBpY2sgaXQgd2hlcmUgaXQgbGVmdCBvZmYuCi0JCWV4cC5jcmVhdGVTdWJleHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJc2Vjb25kRGltZW5zaW9uUHJveHkgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCA0KTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlleHAuY3JlYXRlU3ViZXhwcmVzc2lvbkVuZCgpOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlDUkVBVElPTl9ESU1FTlNJT04sIHNlY29uZERpbWVuc2lvblByb3h5KTsJCQotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludFtdW11bXSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsICgoSUFycmF5QmVhblByb3h5KSgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldCgwKSkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKCgoSUFycmF5QmVhblByb3h5KSgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldCgwKSkuZ2V0KDApKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9FeHByZXNzaW9uVGhyZWFkVHJhbnNmZXJDYWxsQmFjay5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvRXhwcmVzc2lvblRocmVhZFRyYW5zZmVyQ2FsbEJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxMDQ4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9FeHByZXNzaW9uVGhyZWFkVHJhbnNmZXJDYWxsQmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHk7Ci0vKgotICogICRSQ1NmaWxlOiBFeHByZXNzaW9uVGhyZWFkVHJhbnNmZXJDYWxsQmFjay5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRm9yRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkluZml4T3BlcmF0b3I7Ci0vKioKLSAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZvciB0aGUgZXhwcmVzc2lvbiB0ZXN0IHRocmVhZCB0cmFuc2Zlci4gVGhpcyBydW5zIG9uIHRoZSBJREUgc2lkZS4KLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25UaHJlYWRUcmFuc2ZlckNhbGxCYWNrIGltcGxlbWVudHMgSUNhbGxiYWNrIHsKLQkKLQlFeHByZXNzaW9uIGV4cHJlc3Npb247Ci0JcHVibGljIFRocm93YWJsZSBlcnJvcjsKLQlwdWJsaWMgRXhwcmVzc2lvblByb3h5IGVwOwotCQkKLQlwdWJsaWMgRXhwcmVzc2lvblRocmVhZFRyYW5zZmVyQ2FsbEJhY2soRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgY2FsbGVkQmFjayhpbnQgbXNnSUQsIElCZWFuUHJveHkgcGFybSl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBPYmplY3QgcGFybSkgewotCQl0cnkgewotCQkJZXhwcmVzc2lvbi50cmFuc2ZlclRocmVhZCgpOwotCQkJLy8gVGhlIHRlc3QgaGVyZSBpcyBmb3IgZXF1YWxpdHkuCi0JCQkKLQkJCWVwID0gZXhwcmVzc2lvbi5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJZXhwcmVzc2lvbi5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCQlleHByZXNzaW9uLmNyZWF0ZVR5cGVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgImphdmEubGFuZy5TdHJpbmciKTsKLQkJCWV4cHJlc3Npb24uY3JlYXRlVHlwZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgImphdmEubGFuZy5TdHJpbmciKTsKLQkJCQotCQkJCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXJyb3IgPSBlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGV4cHJlc3Npb24uaXNWYWxpZCgpKQotCQkJCXRyeSB7Ci0JCQkJCWV4cHJlc3Npb24uYmVnaW5UcmFuc2ZlclRocmVhZCgpOwkvLyBTZXQgdG8gcmV0dXJuIGV4cHJlc3Npb24gdG8gb3RoZXIgdGhyZWFkLgotCQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWVycm9yID0gZTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkJCWVycm9yID0gZTsKLQkJCQl9CQotCQl9CQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgY2FsbGVkQmFjayhpbnQgbXNnSUQsIE9iamVjdFtdIHBhcm1zKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNhbGxlZEJhY2tTdHJlYW0oaW50IG1zZ0lELCBJbnB1dFN0cmVhbSBpbil7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Byb3h5U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Byb3h5U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxM2RkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9Qcm94eVN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFByb3h5U3VpdGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVRlc3RzUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqIAotICogVGhpcyBzdWl0ZSBpcyBmb3IgdGVzdGluZyBzdHJhaWdodCBQcm94eSBpbmRlcGVuZGVudCBvZiB0aGUgdHlwZSBvZiBwcm94eSAoZS5nLiBSZW1vdGUgb3IgSURFKS4KLSAqIEl0IGNhbid0IHJ1biBieSBpdHNlbGYuIEl0IG5lZWRzIHRvIGhhdmUgdGhlIHJlZ2lzdHJ5IGNyZWF0ZXIgb2JqZWN0IHN0b3JlZCBpbiBpdCBzbyB0aGF0Ci0gKiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0cnkgY2FuIGJlIGNyZWF0ZWQgYW5kIHJlY3JlYXRlZCBhcyBuZWNlc3NhcnkgYnkgdGhlIHRlc3QuCi0gKiAKLSAqIElmIHRoZSB0ZXN0cyBpbmhlcml0IGZyb20gQWJzdHJhY3RUZXN0UHJveHkgdGhlIHNldFJlZ2lzdHJ5SGFuZGxlciB3aWxsIGJlIGNhbGxlZCBvbiBpdC4KLSAqLwotcHVibGljIGNsYXNzIFByb3h5U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0KLQkvLyBUZXN0IGNhc2VzIHRvIGJlIGluY2x1ZGUgaW4gdGhlIHN1aXRlCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgdGVzdHNMaXN0W10gPSB7Ci0JCVRlc3RTdGFuZGFyZC5jbGFzcywKLQkJVGVzdEFXVFByb3h5LmNsYXNzLAotCQlFeHByZXNzaW9uVGVzdC5jbGFzcywKLQkJCQkJCQkJCSAgIH0gOwotCQkJCQkJCQkJICAgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGtnTmFtZSA9ICJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkiIDsKLQkgICAgCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhY2thZ2VTdWl0ZS4KLQkgKi8KLQlwdWJsaWMgUHJveHlTdWl0ZSgpIHsKLQkJc3VwZXIoKTsKLQkJcG9wdWxhdGVTdWl0ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWNrYWdlU3VpdGUuCi0JICogQHBhcmFtIHRoZUNsYXNzCi0JICovCi0JcHVibGljIFByb3h5U3VpdGUoQ2xhc3MgdGhlQ2xhc3MpIHsKLQkJc3VwZXIodGhlQ2xhc3MpOwkJCi0JCXBvcHVsYXRlU3VpdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFja2FnZVN1aXRlLgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFByb3h5U3VpdGUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7CQkKLQkJcG9wdWxhdGVTdWl0ZSgpIDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVTdWl0ZSAoKSB7Ci0JCWZvciAoaW50IGk9MDsgaTx0ZXN0c0xpc3QubGVuZ3RoOyBpKyspCi0JCSAgYWRkVGVzdFN1aXRlKHRlc3RzTGlzdFtpXSkgOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBjb250cmlidXRvciB0byBiZSB1c2VkIHdoZW4gc3RhcnRpbmcgdGVzdHMgc28gdGhhdCBQcm94eVN1aXRlIGNhbiBjb250cmlidXRlIHRvIGl0LgotCSAqIEByZXR1cm4gQSBjb250cmlidXRvciBmb3IgUHJveHkgU3VpdGUgdGVzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IgZ2V0UHJveHlTdWl0ZUNvbnRyaWJ1dG9yKCkgewotCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25Db250cmlidXRvckFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRocyhJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIgY29udHJvbGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWNvbnRyb2xsZXIuY29udHJpYnV0ZUNsYXNzcGF0aChKYXZhVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCksICJ2bS90ZXN0cy5qYXIiLCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuQVBQRU5EX1VTRVJfQ0xBU1NQQVRILCBmYWxzZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdEFXVFByb3h5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9UZXN0QVdUUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjMThiOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9UZXN0QVdUUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RBV1RQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuYXd0LklTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dC5KYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QVdUUHJveHkgZXh0ZW5kcyBBYnN0cmFjdFRlc3RQcm94eSB7Ci0KLQlwdWJsaWMgVGVzdEFXVFByb3h5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUZXN0QVdUUHJveHkoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cyBjb25zdGFudHM7CS8vIElmIHRoaXMgaXMgbnVsbCB0aGVuIGRvbid0IGRvIHRlc3RzLgotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJCi0JCWNvbnN0YW50cyA9IEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKHJlZ2lzdHJ5KTsKLQkJYXNzZXJ0Tm90TnVsbChjb25zdGFudHMpOwotCQlpZiAoIWNvbnN0YW50cy5pc0FXVEF2YWlsYWJsZSgpKSB7Ci0JCQkvLyB0aGlzIGlzIG5vdCBhbiBlcnJvci4gSXQganVzdCBtZWFucyB3ZSBkb24ndCBhbnl0aGluZy4gVGhpcyBpcyBzaWduaWZpZWQgYnkgY29uc3RhbnRzIGJlaW5nIG51bGwuCi0JCQljb25zdGFudHMgPSBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBV1RDb2xvcigpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnN0YW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwkvLyBObyBBV1QsIHNvIHRlc3QgaXNuJ3QgZG9uZSwgYnV0IHN0aWxsIGNvbnNpZGVyZWQgZ29vZC4KLQkJCQotCQkvLyBBV1QgQ29sb3IgdGVzdHMKLQkJSUJlYW5UeXBlUHJveHkgY29sb3JUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Db2xvciIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoY29sb3JUeXBlKTsKLQkJSUJlYW5Qcm94eSBjb2xvclByb3h5ID0gY29sb3JUeXBlLm5ld0luc3RhbmNlKCJqYXZhLmF3dC5Db2xvci5jeWFuIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChjb2xvclByb3h5KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmF3dC5Db2xvcltyPTAsZz0yNTUsYj0yNTVdIiwgY29sb3JQcm94eS50b0JlYW5TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBV1RQcm94eUZhY3RvcnkoKSB7Ci0JCWlmIChjb25zdGFudHMgPT0gbnVsbCkKLQkJCXJldHVybjsJLy8gTm8gQVdULCBzbyB0ZXN0IGlzbid0IGRvbmUsIGJ1dCBzdGlsbCBjb25zaWRlcmVkIGdvb2QuCi0JCQkKLQkJSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeSBhd3RQcm94eUZhY3RvcnkgPSAoSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeSkgcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeUV4dGVuc2lvbihJU3RhbmRhcmRBd3RCZWFuUHJveHlGYWN0b3J5LlJFR0lTVFJZX0tFWSk7Ci0JCWFzc2VydE5vdE51bGwoYXd0UHJveHlGYWN0b3J5KTsKLQkJCi0JCS8vIFRlc3QgdGhlIGNyZWF0aW9uIHRocm91Z2ggdGhlIGhlbHBlcnMsIHBsdXMgdGVzdCBzcGVjaWFsIG1ldGhvZHMgCi0JCUlEaW1lbnNpb25CZWFuUHJveHkgZGltQmVhbiA9IGF3dFByb3h5RmFjdG9yeS5jcmVhdGVEaW1lbnNpb25CZWFuUHJveHlXaXRoKDUsNik7Ci0JCWFzc2VydE5vdE51bGwoZGltQmVhbik7Ci0JCWFzc2VydEVxdWFscygiamF2YS5hd3QuRGltZW5zaW9uW3dpZHRoPTUsaGVpZ2h0PTZdIiwgZGltQmVhbi50b0JlYW5TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDUsIGRpbUJlYW4uZ2V0V2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBkaW1CZWFuLmdldEhlaWdodCgpKTsJCQotCQkKLQkJSVBvaW50QmVhblByb3h5IHBvaW50QmVhbiA9IGF3dFByb3h5RmFjdG9yeS5jcmVhdGVQb2ludEJlYW5Qcm94eVdpdGgoNSw2KTsKLQkJYXNzZXJ0Tm90TnVsbChwb2ludEJlYW4pOwotCQlhc3NlcnRFcXVhbHMoImphdmEuYXd0LlBvaW50W3g9NSx5PTZdIiwgcG9pbnRCZWFuLnRvQmVhblN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoNSwgcG9pbnRCZWFuLmdldFgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBwb2ludEJlYW4uZ2V0WSgpKTsJCQotCQkKLQkJSVJlY3RhbmdsZUJlYW5Qcm94eSByZWN0QmVhbiA9IGF3dFByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDUsNiw3LDgpOwotCQlhc3NlcnROb3ROdWxsKHJlY3RCZWFuKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmF3dC5SZWN0YW5nbGVbeD01LHk9Nix3aWR0aD03LGhlaWdodD04XSIsIHJlY3RCZWFuLnRvQmVhblN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoNSwgcmVjdEJlYW4uZ2V0WCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHJlY3RCZWFuLmdldFkoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKDcsIHJlY3RCZWFuLmdldFdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoOCwgcmVjdEJlYW4uZ2V0SGVpZ2h0KCkpOwkJCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFXVFNwZWNpYWxzSW5pdFN0cmluZygpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnN0YW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwkvLyBObyBBV1QsIHNvIHRlc3QgaXNuJ3QgZG9uZSwgYnV0IHN0aWxsIGNvbnNpZGVyZWQgZ29vZC4KLQkJCQotCQkKLQkJLy8gVGVzdCB0aGUgY3JlYXRpb24gdGhyb3VnaCBpbml0IHN0cmluZ3MKLQkJSUJlYW5UeXBlUHJveHkgZGltVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuRGltZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChkaW1UeXBlKTsJCQotCQlJRGltZW5zaW9uQmVhblByb3h5IGRpbUJlYW4gPSAoSURpbWVuc2lvbkJlYW5Qcm94eSkgZGltVHlwZS5uZXdJbnN0YW5jZSgibmV3IGphdmEuYXd0LkRpbWVuc2lvbig3LDgpIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChkaW1CZWFuKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmF3dC5EaW1lbnNpb25bd2lkdGg9NyxoZWlnaHQ9OF0iLCBkaW1CZWFuLnRvQmVhblN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSUJlYW5UeXBlUHJveHkgcG9pbnRUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Qb2ludCIpOyAvLyROT04tTkxTLTEkCi0JCUlQb2ludEJlYW5Qcm94eSBwb2ludEJlYW4gPSAoSVBvaW50QmVhblByb3h5KSBwb2ludFR5cGUubmV3SW5zdGFuY2UoIm5ldyBqYXZhLmF3dC5Qb2ludCg1LDYpIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChwb2ludEJlYW4pOwotCQlhc3NlcnRFcXVhbHMoImphdmEuYXd0LlBvaW50W3g9NSx5PTZdIiwgcG9pbnRCZWFuLnRvQmVhblN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSUJlYW5UeXBlUHJveHkgcmVjdFR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LlJlY3RhbmdsZSIpOyAvLyROT04tTkxTLTEkCi0JCUlSZWN0YW5nbGVCZWFuUHJveHkgcmVjdEJlYW4gPSAoSVJlY3RhbmdsZUJlYW5Qcm94eSkgcmVjdFR5cGUubmV3SW5zdGFuY2UoIm5ldyBqYXZhLmF3dC5SZWN0YW5nbGUoNSw2LDcsOCkiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKHJlY3RCZWFuKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmF3dC5SZWN0YW5nbGVbeD01LHk9Nix3aWR0aD03LGhlaWdodD04XSIsIHJlY3RCZWFuLnRvQmVhblN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdENhbGxiYWNrLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9UZXN0Q2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5MzM0YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9UZXN0Q2FsbGJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RDYWxsYmFjay5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLS8qKgotICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgZm9yIHRoZSB0ZXN0IGNhc2UuIFRoaXMgcnVucyBvbiB0aGUgSURFIHNpZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q2FsbGJhY2sgaW1wbGVtZW50cyBJQ2FsbGJhY2sgewotCQotCU9iamVjdCB0ZXN0ZXI7Ci0JUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0JCi0JaW50IGNvdW50ZXIgPSAwOwotCQotCS8qKgotCSAqIFRoaXMgd2lsbCBkbyBhc3NlcnQgdGVzdHMgdG8gbWFrZSBzdXJlIHRlc3QgY29tcGxldGVkIGNvcnJlY3RseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGVkKCkgewotCQlpZiAoYmFkUGFybVR5cGUgIT0gbnVsbCkKLQkJCVRlc3RDYXNlLmFzc2VydEVxdWFscyhJSW50ZWdlckJlYW5Qcm94eS5jbGFzcywgYmFkUGFybVR5cGUpOwotCQlpZiAoYmFkUGFybVZhbHVlICE9IDApCi0JCQlUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoZ29vZFBhcm1WYWx1ZSwgYmFkUGFybVZhbHVlKTsKLQkJaWYgKGJhZE1zZyAhPSBudWxsKQotCQkJVGVzdENhc2UuZmFpbChiYWRNc2cpOwotCQlUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoMiwgY291bnRlcik7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzdG9wcGVkVGVzdDsKLQlwcml2YXRlIENsYXNzIGJhZFBhcm1UeXBlID0gbnVsbDsKLQlwcml2YXRlIGludCBiYWRQYXJtVmFsdWUsIGdvb2RQYXJtVmFsdWU7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFkTXNnOwotCQotCS8vIE5vcm1hbGx5IHRoZSBjYWxsYmFjayBkb2Vzbid0IGRldGVybWluZSB3aGVuIHRvIHN0b3AgCi0JLy8gdGhlIGNhbGxiYWNrIHByb3h5LiBCdXQgZm9yIHRoaXMgdGVzdCBpdCBkb2VzLgotCXB1YmxpYyBUZXN0Q2FsbGJhY2soT2JqZWN0IHQsIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXRlc3RlciA9IHQ7Ci0JCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgSUJlYW5Qcm94eSBwYXJtKXsKLQkJc3luY2hyb25pemVkKHRlc3RlcikgewotCQkJaWYgKHN0b3BwZWRUZXN0KQotCQkJCXJldHVybiBudWxsOwkvLyBXZSd2ZSBhbHJlYWR5IHN0b3BwZWQsIGRvbid0IGRvIGFueW1vcmUuCi0JCX0KLQkJCi0JCWlmIChtc2dJRCAhPSAwKSB7Ci0JCQliYWRNc2cgPSAiTXNnaWQgIiArIG1zZ0lEICsgIiBpcyBpbmNvcnJlY3QuIEl0IHNob3VsZCBiZSB6ZXJvLiI7Ci0JCQlzdG9wVGVzdCgpOwotCQl9IGVsc2UgaWYgKHBhcm0gaW5zdGFuY2VvZiBJSW50ZWdlckJlYW5Qcm94eSkgewotCQkJaW50IHB2ID0gKChJSW50ZWdlckJlYW5Qcm94eSkgcGFybSkuaW50VmFsdWUoKTsKLQkJCWlmICgrK2NvdW50ZXIgIT0gcHYpIHsKLQkJCQliYWRQYXJtVmFsdWUgPSBwdjsKLQkJCQlnb29kUGFybVZhbHVlID0gY291bnRlcjsKLQkJCQlzdG9wVGVzdCgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYgKGNvdW50ZXIgPT0gMikgewotCQkJCXN0b3BUZXN0KCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBCYWQgcGFybSB0eXBlLgotCQkJYmFkUGFybVR5cGUgPSBwYXJtLmdldENsYXNzKCk7Ci0JCQlzdG9wVGVzdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBPYmplY3QgcGFybSkgewotCQlpZiAobXNnSUQgIT0gMSkgewotCQkJYmFkTXNnID0gIk1zZ2lkICIgKyBtc2dJRCArICIgaXMgaW5jb3JyZWN0LiBJdCBzaG91bGQgYmUgb25lLiI7Ci0JCQlzdG9wVGVzdCgpOwotCQl9IGVsc2UgaWYgKHBhcm0gaW5zdGFuY2VvZiBJbnRlZ2VyKXsKLQkJCS8vIFdlIGFyZSBnb2luZyB0byB1c2UgdGhlIHJlZ2lzdHJ5IHRvIHNlZSB3aGF0IHRocmVhZCBpZCBpcyBydW5uaW5nIHdoZW4gd2UgY2FsbCBpbnRvIGl0LgotCQkJSU1ldGhvZFByb3h5IGN1cnJlbnRUaHJlYWRNZXRob2QgPSByZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLlRocmVhZCIsICJjdXJyZW50VGhyZWFkIiwgbnVsbCk7Ci0JCQlJQmVhblByb3h5IHRocmVhZCA9IGN1cnJlbnRUaHJlYWRNZXRob2QuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKG51bGwpOwotCQkJSU1ldGhvZFByb3h5IGhhc2hjb2RlTWV0aG9kID0gcmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5PYmplY3QiLCAiaGFzaENvZGUiLCBudWxsKTsKLQkJCUlCZWFuUHJveHkgdGhyZWFkSUQgPSBoYXNoY29kZU1ldGhvZC5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhyZWFkKTsKLQkJCWlmICh0aHJlYWRJRCBpbnN0YW5jZW9mIElOdW1iZXJCZWFuUHJveHkpIHsKLQkJCQlpZiAoIXBhcm0uZXF1YWxzKCgoSU51bWJlckJlYW5Qcm94eSkgdGhyZWFkSUQpLm51bWJlclZhbHVlKCkpKSB7Ci0JCQkJCWJhZE1zZyA9ICJUaHJlYWRJRCByZXR1cm5lZCBmcm9tIGNhbGwgbm90IG1hdGNoIHBhcm0gc2VudCBpdC4gTWVhbnMgY2FsbGJhY2sgbm90IG9uIHNhbWUgdGhyZWFkLiI7Ci0JCQkJCXN0b3BUZXN0KCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQliYWRNc2cgPSAiVGhyZWFkSUQgcmV0dXJuZWQgZnJvbSBjYWxsIGlzIG5vdCB2YWxpZC4iOwotCQkJCXN0b3BUZXN0KCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQliYWRNc2cgPSAiUGFybSBpcyBpbnZhbGlkIGZvciBjYWxsZWRCYWNrIHdpdGggT2JqZWN0IjsKLQkJCXN0b3BUZXN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgY2FsbGVkQmFjayhpbnQgbXNnSUQsIE9iamVjdFtdIHBhcm1zKXsKLQkJYmFkTXNnID0gIkZhaWxlZCBDYWxsYmFjayBUZXN0LiBTaG91bGRuJ3QgaGF2ZSBnb3R0b24gdG8gbXVsdGktcGFybXMiOyAvLyROT04tTkxTLTEkCi0JCXN0b3BUZXN0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjYWxsZWRCYWNrU3RyZWFtKGludCBtc2dJRCwgSW5wdXRTdHJlYW0gaW4pewotCQliYWRNc2cgPSAiRmFpbGVkIENhbGxiYWNrIFRlc3QuIFNob3VsZG4ndCBoYXZlIGdvdHRvbiB0byBpbnB1dCBzdHJlYW0iOyAvLyROT04tTkxTLTEkCi0JCXN0b3BUZXN0KCk7Ci0JfQkKLQkKLQl2b2lkIHN0b3BUZXN0KCkgewotCQlzeW5jaHJvbml6ZWQodGVzdGVyKSB7Ci0JCQlzdG9wcGVkVGVzdCA9IHRydWU7Ci0JCQl0ZXN0ZXIubm90aWZ5KCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Rlc3RDYWxsYmFja1N0cmVhbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdENhbGxiYWNrU3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZGMyNzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdENhbGxiYWNrU3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHk7Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0Q2FsbGJhY2tTdHJlYW0uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLS8qKgotICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgZm9yIHRoZSB0ZXN0IGNhc2Ugb2YgdGhlIHN0cmVhbS4gVGhpcyBydW5zIG9uIHRoZSBJREUgc2lkZS4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RDYWxsYmFja1N0cmVhbSBpbXBsZW1lbnRzIElDYWxsYmFjayB7Ci0KLQlPYmplY3QgdGVzdGVyOwkvLyBOb3RpZmllZCB3aGVuIHRoZSB0ZXN0IGlzIGZpbmlzaGVkLgotCQotCXByaXZhdGUgYm9vbGVhbiB0ZXN0U3RvcHBlZDsKLQlwcml2YXRlIFN0cmluZyBiYWRNc2c7Ci0JcHJpdmF0ZSBJT0V4Y2VwdGlvbiBleHA7Ci0JcHJpdmF0ZSBib29sZWFuIHRlc3RTdWNjZXNmdWw7Ci0JCi0JcHVibGljIFRlc3RDYWxsYmFja1N0cmVhbShPYmplY3QgbykgewotCQl0ZXN0ZXIgPSBvOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYmFkTXNnICE9IG51bGwpCi0JCQlUZXN0Q2FzZS5mYWlsKGJhZE1zZyk7Ci0JCWlmIChleHAgIT0gbnVsbCkKLQkJCXRocm93IGV4cDsKLQkJVGVzdENhc2UuYXNzZXJ0VHJ1ZSh0ZXN0U3VjY2VzZnVsKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBPYmplY3QgIHBhcm0pewotCQliYWRNc2cgPSAiRmFpbGVkIENhbGxiYWNrIFRlc3QuIFNob3VsZG4ndCBoYXZlIGdvdHRvbiB0byBvYmplY3QgcGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcFRlc3QoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBPYmplY3QgY2FsbGVkQmFjayhpbnQgbXNnSUQsIElCZWFuUHJveHkgcGFybSl7Ci0JCWJhZE1zZyA9ICJGYWlsZWQgQ2FsbGJhY2sgVGVzdC4gU2hvdWxkbid0IGhhdmUgZ290dG9uIHRvIHBhcm0iOyAvLyROT04tTkxTLTEkCi0JCXN0b3BUZXN0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBPYmplY3RbXSBwYXJtcyl7Ci0JCWJhZE1zZyA9ICJGYWlsZWQgQ2FsbGJhY2sgVGVzdC4gU2hvdWxkbid0IGhhdmUgZ290dG9uIHRvIG11bHRpLXBhcm1zIjsgLy8kTk9OLU5MUy0xJAotCQlzdG9wVGVzdCgpOwkJCi0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgdm9pZCBjYWxsZWRCYWNrU3RyZWFtKGludCBtc2dJRCwgSW5wdXRTdHJlYW0gaW4pewotCQkvLyBSZWFkIGZyb20gdGhlIHN0cmVhbSBmb3IgMzAwMDAgYnl0ZXMuIFZlcmlmeSB0aGF0Ci0JCS8vIHdlIGdldCBhbiBpbmNyZW1lbnRpbmcgc3RyZWFtLCBpLmUuIDAsIDEsIC4uLiwgMTI3LCAtMTI3LCAuLi4KLQkJCi0JCXN5bmNocm9uaXplZCAodGVzdGVyKSB7Ci0JCQlpZiAodGVzdFN0b3BwZWQpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGk9MDsgaTwzMDAwMDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWludCBuZXh0ID0gaW4ucmVhZCgpOwotCQkJCWlmIChuZXh0ID09IC0xKSB7Ci0JCQkJCWJhZE1zZyA9ICJGYWlsZWQgQ2FsbGJhY2sgU3RyZWFtIHRlc3QuIFN0cmVhbSBlbmRlZCB0b28gc29vbi4gT24gY291bnRlcj0iK1N0cmluZy52YWx1ZU9mKGkpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0b3BUZXN0KCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCgoYnl0ZSkgbmV4dCkgIT0gKChieXRlKSBpKSkgewotCQkJCQliYWRNc2cgPSAiRmFpbGVkIENhbGxiYWNrIFN0cmVhbSB0ZXN0LiBEaWQgbm90IGdldCBjb3JyZWN0IG5leHQgYnl0ZSBhdDoiICsgaTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdG9wVGVzdCgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWV4cCA9IGU7Ci0JCQkJc3RvcFRlc3QoKTsJCQkJCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQl0cnkgewotCQkJaWYgKGluLnJlYWQoKSAhPSAtMSkgewotCQkJCWJhZE1zZyA9ICJGYWlsZWQgQ2FsbGJhY2sgU3RyZWFtIHRlc3QuIFRvbyBtdWNoIGRhdGEgc2VudC4iOyAvLyROT04tTkxTLTEkCi0JCQkJc3RvcFRlc3QoKTsJCQkJCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlleHAgPSBlOwotCQl9Ci0JCQotCQl0ZXN0U3VjY2VzZnVsID0gdHJ1ZTsKLQkJc3RvcFRlc3QoKTsKLQl9Ci0JCi0Jdm9pZCBzdG9wVGVzdCgpIHsKLQkJc3luY2hyb25pemVkKHRlc3RlcikgewotCQkJdGVzdFN0b3BwZWQgPSB0cnVlOwotCQkJdGVzdGVyLm5vdGlmeSgpOwotCQl9Ci0JfQotCQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdFN0YW5kYXJkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9UZXN0U3RhbmRhcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4MWIzNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9UZXN0U3RhbmRhcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5OwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkFtYmlndW91c01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVGVzdFN0YW5kYXJkIGV4dGVuZHMgQWJzdHJhY3RUZXN0UHJveHkgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFRlc3RTdGFuZGFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBUZXN0U3RhbmRhcmQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9iamVjdCgpIHsKLQkJSUJlYW5UeXBlUHJveHkgb2JqZWN0VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk9iamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwob2JqZWN0VHlwZSk7Ci0JCWFzc2VydEZhbHNlKG9iamVjdFR5cGUuaXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0Iiwgb2JqZWN0VHlwZS5nZXRUeXBlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFR5cGVPZigpIHsKLQkJSUJlYW5UeXBlUHJveHkgb2JqZWN0VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk9iamVjdCIpOyAvLyROT04tTkxTLTEkCQkKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChpbnRlZ2VyVHlwZSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBpbnRlZ2VyVHlwZS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpbnRlZ2VyVHlwZS5pc0tpbmRPZihvYmplY3RUeXBlKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZEludm9rZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7CQkKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQotCQlJTWV0aG9kUHJveHkgbXRoZCA9IGludGVnZXJUeXBlLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgImphdmEubGFuZy5TdHJpbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydE5vdE51bGwobXRoZCk7Ci0JCS8vIFNlZSBpZiB3ZSBjYW4gaW52b2tlIG1ldGhvZHMuCi0JCUlJbnRlZ2VyQmVhblByb3h5IGFuSW50ID0gKElJbnRlZ2VyQmVhblByb3h5KSBtdGhkLmludm9rZShudWxsLCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgiNSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGFuSW50KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGFuSW50LmludFZhbHVlKCkpOwotCQkvLyBTZWUgaWYgaW52b2tlIHdpdGggYmFkIHR5cGUgdGhyb3dzIHRoZSBFeGNlcHRpb25Qcm94eS4KLQkJdHJ5IHsKLQkJCW10aGQuaW52b2tlKG51bGwsIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDUpKTsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBub3QgdGhyb3duIGxpa2UgaXQgc2hvdWxkIG9mIGJlZW4uIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFdlIHNob3VsZCBvZiBnb3R0b24gdGhlIGV4Y2VwdGlvbi4gU2VlIGlmIGl0IGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUuCi0JCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBlLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0JCQkJCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52b2tlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJLy8gVGVjaG5pY2FsbHkgaW52b2thYmxlcyBzaG91bGQgYmUgdXNlZCBmb3Igb25lLXNob3QgdXNhZ2UsIGJ1dCBoZXJlIHRvIHRlc3QgdGhlIGludm9rZSBjb3JyZWN0bHkKLQkJLy8gaXQgd2lsbCBiZSB1c2VkIHR3aWNlLiBUaGlzIGlzIG5vdCBhbiBlcnJvciwganVzdCBvdmVyaGVhZC4KLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQotCQlJSW52b2thYmxlIGludm9rYWJsZSA9IGludGVnZXJUeXBlLmdldEludm9rYWJsZSgidmFsdWVPZiIsICJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnROb3ROdWxsKGludm9rYWJsZSk7Ci0JCS8vIFNlZSBpZiB3ZSBjYW4gaW52b2tlIG1ldGhvZHMuCi0JCUlJbnRlZ2VyQmVhblByb3h5IGFuSW50ID0gKElJbnRlZ2VyQmVhblByb3h5KSBpbnZva2FibGUuaW52b2tlKG51bGwsIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKCI1IikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYW5JbnQpOwotCQlhc3NlcnRFcXVhbHMoNSwgYW5JbnQuaW50VmFsdWUoKSk7Ci0JCS8vIFNlZSBpZiBpbnZva2Ugd2l0aCBiYWQgdHlwZSB0aHJvd3MgdGhlIEV4Y2VwdGlvblByb3h5LgotCQl0cnkgewotCQkJaW52b2thYmxlLmludm9rZShudWxsLCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCg1KSk7Ci0JCQlmYWlsKCJFeGNlcHRpb24gbm90IHRocm93biBsaWtlIGl0IHNob3VsZCBvZiBiZWVuLiIpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBXZSBzaG91bGQgb2YgZ290dG9uIHRoZSBleGNlcHRpb24uIFNlZSBpZiBpdCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlLgotCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgZS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9CQkJCQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZUluaXRTdHJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCQlJQmVhblR5cGVQcm94eSBpbnRlZ2VyVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJLy8gU2VlIGlmIHdlIGNhbiBjcmVhdGUgaXQgZnJvbSBhbiBpbml0aWFsaXphdGlvbiBzdHJpbmcuCi0JCUlJbnRlZ2VyQmVhblByb3h5IGFuSW50ID0gKElJbnRlZ2VyQmVhblByb3h5KSBpbnRlZ2VyVHlwZS5uZXdJbnN0YW5jZSgibmV3IGphdmEubGFuZy5JbnRlZ2VyKDYpIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChhbkludCk7Ci0JCWFzc2VydEVxdWFscyg2LCBhbkludC5pbnRWYWx1ZSgpKTsKLQotCQkvLyBTZWUgaWYgc3RyaW5nIGluaXRpYWxpemF0aW9uIHdvcmtzLgotCQlJU3RyaW5nQmVhblByb3h5IGFTdHJpbmcgPSAoSVN0cmluZ0JlYW5Qcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuU3RyaW5nIikubmV3SW5zdGFuY2UoIlwiYWJjZFwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnROb3ROdWxsKGFTdHJpbmcpOwotCQlhc3NlcnRFcXVhbHMoImFiY2QiLCBhU3RyaW5nLnN0cmluZ1ZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb25zdHJ1Y3RvcnMoKSB7Ci0JCUlCZWFuVHlwZVByb3h5IHN0cmluZ1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5TdHJpbmciKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCi0JCS8vIEdldCBhbGwgY29uc3RydWN0b3JzLgotCQlJQ29uc3RydWN0b3JQcm94eVtdIGN0b3JzID0gc3RyaW5nVHlwZS5nZXRDb25zdHJ1Y3RvcnMoKTsKLQkJYXNzZXJ0Tm90TnVsbChjdG9ycyk7Ci0JCWludCBleHBlY3RlZEN0b3JzID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iLCIiKS5zdGFydHNXaXRoKCIxLjUiKSA/IDEzIDogMTE7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZEN0b3JzLCBjdG9ycy5sZW5ndGgpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0QWNjZXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkKLQkJLy8gR2V0IGFsbCBjb25zdHJ1Y3RvcnMuCi0JCUlDb25zdHJ1Y3RvclByb3h5W10gY3RvcnMgPSB0ZXN0QWNjZXNzVHlwZS5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOwotCQlhc3NlcnROb3ROdWxsKGN0b3JzKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGN0b3JzLmxlbmd0aCk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQ29uc3RydWN0b3IoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSBpbnRlZ2VyVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCi0JCS8vIFNlZSBpZiB3ZSBjYW4gY3JlYXRlIGl0IGZyb20gYSBjb25zdHJ1Y3Rvci4KLQkJSUNvbnN0cnVjdG9yUHJveHkgY3RvciA9IGludGVnZXJUeXBlLmdldENvbnN0cnVjdG9yUHJveHkobmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLlN0cmluZyJ9KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGN0b3IpOwotCQlJSW50ZWdlckJlYW5Qcm94eSBhbkludCA9IChJSW50ZWdlckJlYW5Qcm94eSkgY3Rvci5uZXdJbnN0YW5jZShuZXcgSUJlYW5Qcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgiMCIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDAsIGFuSW50LmludFZhbHVlKCkpOwotCQkJCQkJCi0JCS8vIFplcm8gaXMgY2FjaGVkLCBsZXQncyBzZWUgaWYgdGhhdCBpcyB3aGF0IHdlIGdvdCBhYm92ZS4KLQkJSUludGVnZXJCZWFuUHJveHkgYVplcm8gPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChuZXcgSW50ZWdlcigwKSk7Ci0JCWFzc2VydFNhbWUoYW5JbnQsIGFaZXJvKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRGVjbGFyZWRDb25zdHJ1Y3RvcigpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RBY2Nlc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBTZWUgaWYgd2UgY2FuIGdldCBhIHByaXZhdGUgY29uc3RydWN0b3IuCi0JCUlDb25zdHJ1Y3RvclByb3h5IGN0b3IgPSB0ZXN0QWNjZXNzVHlwZS5nZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkobmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24ifSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChjdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlUmV0dXJuKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBTZWUgdGhhdCB3ZSBnZXQgYSBwcmltaXRpdmUgYmFjayB3aGVuIHRoZSBtZXRob2QgcmV0dXJuIHR5cGUgaXMgYSBwcmltaXRpdmUuCi0JCUlNZXRob2RQcm94eSBtdGhkUHJpbSA9IGludGVnZXJUeXBlLmdldE1ldGhvZFByb3h5KCJpbnRWYWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCUlJbnRlZ2VyQmVhblByb3h5IGFuSW50ID0gKElJbnRlZ2VyQmVhblByb3h5KSBtdGhkUHJpbS5pbnZva2UocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoNSkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGFuSW50LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscyg1LCBhbkludC5pbnRWYWx1ZSgpKTsKLQkJCi0JCS8vIFNlZSB0aGF0IHdlIGdldCBhIHByaW1pdGl2ZSBiYWNrIHdoZW4gdGhlIGZpZWxkIGlzIGEgcHJpbWl0aXZlLgotCQlJRmllbGRQcm94eSBmaWVsZFByaW0gPSBpbnRlZ2VyVHlwZS5nZXRGaWVsZFByb3h5KCJNSU5fVkFMVUUiKTsgLy8kTk9OLU5MUy0xJAotCQlhbkludCA9IChJSW50ZWdlckJlYW5Qcm94eSkgZmllbGRQcmltLmdldChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBhbkludC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci5NSU5fVkFMVUUsIGFuSW50LmludFZhbHVlKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUFycmF5VHlwZSgpIHsKLQkJLy8gVGVzdCBQcmltaXRpdmUgYXJyYXlzLgotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIltJIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChhcnJheVR5cGUpOwotCQlhc3NlcnRUcnVlKGFycmF5VHlwZS5pc0FycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMoIltJIiwgYXJyYXlUeXBlLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscyhwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImludCIpLCBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0QXJyYXlUeXBlKCkgewotCQkvLyBUZXN0IHNpbXBsZSBvYmplY3QgdHlwZSBhcnJheQotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIltMamF2YS5sYW5nLkludGVnZXI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChhcnJheVR5cGUpOwotCQlhc3NlcnRUcnVlKGFycmF5VHlwZS5pc0FycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMoIltMamF2YS5sYW5nLkludGVnZXI7IiwgYXJyYXlUeXBlLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscyhwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIiksIGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZTJEQXJyYXlUeXBlKCkgewotCQkvLyBUZXN0IHR3byBkaW1lbnNpb24gcHJpbWl0aXZlIGFycmF5Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiW1tJIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChhcnJheVR5cGUpOwotCQlhc3NlcnRUcnVlKGFycmF5VHlwZS5pc0FycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMoIltbSSIsIGFycmF5VHlwZS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJbSSIpLCBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gVGVzdCBjb25zdHJ1Y3Rpb24gdXNpbmcgYWNjZXNzb3IuCi0JCWFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImludCIsIDIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYXJyYXlUeXBlKTsKLQkJYXNzZXJ0VHJ1ZShhcnJheVR5cGUuaXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0kiLCBhcnJheVR5cGUuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9iamVjdDJEQXJyYXlUeXBlKCkgewotCQkvLyBUZXN0IHR3byBkaW1lbnNpb24gb2JqZWN0IHR5cGUgYXJyYXkKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJbW0xqYXZhLmxhbmcuSW50ZWdlcjsiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGFycmF5VHlwZSk7Ci0JCWFzc2VydFRydWUoYXJyYXlUeXBlLmlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscygiW1tMamF2YS5sYW5nLkludGVnZXI7IiwgYXJyYXlUeXBlLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscyhwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIltMamF2YS5sYW5nLkludGVnZXI7IiksIGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBUZXN0IGdldCB0eXBlIHVzaW5nIGFjY2Vzc29yLgotCQlhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIsIDIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYXJyYXlUeXBlKTsKLQkJYXNzZXJ0VHJ1ZShhcnJheVR5cGUuaXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0xqYXZhLmxhbmcuSW50ZWdlcjsiLCBhcnJheVR5cGUuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlUeXBlRnJvbUFycmF5VHlwZSgpIHsKLQkJLy8gVGVzdCBjcmVhdGluZyBhbiBhcnJheSB0eXBlIGZyb20gYW4gYXJyYXkgdHlwZSwgaS5lLiBhZGRpbmcgZGltZW5zaW9ucy4KLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJbTGphdmEubGFuZy5JbnRlZ2VyOyIsIDIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYXJyYXlUeXBlKTsKLQkJYXNzZXJ0VHJ1ZShhcnJheVR5cGUuaXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW1tMamF2YS5sYW5nLkludGVnZXI7IiwgYXJyYXlUeXBlLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUZyb21BY2Nlc3NvclNpbXBsZVR5cGUoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSBpbnRlZ2VyVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCi0JCS8vIFRlc3QgY3JlYXRpbmcgYW4gYXJyYXkgd2l0aCBhY2Nlc3NvciBvZiBtb3JlIHRoYW4gb25lIGRpbWVuc2lvbiB3aXRoIGNvbXBvbmVudCB0eXBlIG5vdCBhbiBhcnJheS4KLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChpbnRlZ2VyVHlwZSwgbmV3IGludFtdIHszLCA0fSk7Ci0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0JCWFzc2VydEVxdWFscygiW1tMamF2YS5sYW5nLkludGVnZXI7IiwgYXJyYXlQcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoMywgYXJyYXlQcm94eS5nZXRMZW5ndGgoKSk7Ci0JCQotCQkvLyBnZXQoMCkgc2hvdWxkIGJlIGFuIEludGVnZXJbNF0uCi0JCWFycmF5UHJveHkgPSAoSUFycmF5QmVhblByb3h5KSBhcnJheVByb3h5LmdldCgwKTsKLQkJYXNzZXJ0Tm90TnVsbChhcnJheVByb3h5KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGFycmF5UHJveHkuZ2V0TGVuZ3RoKCkpOwkJCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RnJvbUFjY2Vzc29yQXJyYXlUeXBlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIsIDEpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBUZXN0IGNyZWF0aW5nIGFuIGFycmF5IHdpdGggYWNjZXNzb3IgYnV0IGNvbXBvbmVudCB0eXBlIGlzIGFuIGFycmF5LgkJCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheVByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXlUeXBlLCBuZXcgaW50W10gezF9KTsKLQkJYXNzZXJ0Tm90TnVsbChhcnJheVByb3h5KTsKLQkJYXNzZXJ0RXF1YWxzKCJbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5UHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDEsIGFycmF5UHJveHkuZ2V0TGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlGcm9tQWNjZXNzb3JBcnJheVR5cGVNdWx0aURpbSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFRlc3QgY3JlYXRpbmcgYW4gYXJyYXkgd2l0aCBhY2Nlc3NvciBidXQgY29tcG9uZW50IHR5cGUgaXMgYW4gYXJyYXksIGJ1dCBleHRlbmQgYW5kIGFkZCBhIGRpbWVuc2lvbi4JCQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgbmV3IGludFtdIHsyICwzfSk7Ci0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0JCWFzc2VydEVxdWFscygiW1tMamF2YS5sYW5nLkludGVnZXI7IiwgYXJyYXlQcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoMiwgYXJyYXlQcm94eS5nZXRMZW5ndGgoKSk7Ci0KLQkJLy8gVGVzdCBmaXJzdCBlbnRyeSBpcyBhbiBJbnRlZ2VyWzNdCQkKLQkJSUFycmF5QmVhblByb3h5IGlkeDEgPSAoSUFycmF5QmVhblByb3h5KSBhcnJheVByb3h5LmdldCgwKTsKLQkJYXNzZXJ0Tm90TnVsbChpZHgxKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlkeDEuZ2V0TGVuZ3RoKCkpOwotCQkKLQkJLy8gVGVzdCBbMV1bMl0gaXMgbnVsbC4KLQkJSUJlYW5Qcm94eSBpZHgyID0gYXJyYXlQcm94eS5nZXQobmV3IGludCBbXSB7MSwyfSk7Ci0JCWFzc2VydE51bGwoaWR4Mik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheVNldCgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuUHJveHkgYW5JbnQgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChuZXcgamF2YS5sYW5nLkludGVnZXIoMjMpKTsKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIsIDEpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgbmV3IGludFtdIHsyICwzfSk7Ci0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0JCWFzc2VydEVxdWFscygiW1tMamF2YS5sYW5nLkludGVnZXI7IiwgYXJyYXlQcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoMiwgYXJyYXlQcm94eS5nZXRMZW5ndGgoKSk7Ci0KLQkJLy8gVGVzdCBmaXJzdCBlbnRyeSBpcyBhbiBJbnRlZ2VyWzNdCQkKLQkJSUFycmF5QmVhblByb3h5IGlkeDEgPSAoSUFycmF5QmVhblByb3h5KSBhcnJheVByb3h5LmdldCgwKTsKLQkJCi0JCS8vIFRlc3Qgc2V0IGludG8gYXJyYXkgaWR4MSwgYnV0IHJldHJpZXZlIGZyb20gYXJyYXlQcm94eS4gVGVzdHMKLQkJLy8gICAxKSBTZXQgd2l0aCBvbmUgaW5kZXggaW50byBhcnJheSBmcm9tIG91dGVyIGFycmF5WzBdCi0JCS8vICAgMikgR2V0IHdpdGggbXVsdGkgaW5kZXggZnJvbSBvdXRlciBhcnJheQotCQkvLyAgIDMpIEFuZCB0aGF0IHRoZSBzYW1lIGFycmF5IGlzIHNldCB0aGF0IGV4aXN0cyB3aXRoaW4gdGhlIGZpcnN0IGFycmF5LgotCQlpZHgxLnNldChhbkludCwgMik7Ci0JCUlCZWFuUHJveHkgaWR4MyA9IGFycmF5UHJveHkuZ2V0KG5ldyBpbnRbXSB7MCwgMn0pOwotCQlhc3NlcnROb3ROdWxsKGlkeDMpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgaWR4My5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoYW5JbnQsIGlkeDMpOwotCQkKLQkJLy8gSW52ZXJzZSB0ZXN0IG9mIGFib3ZlLCBtdWx0aSBzZXQsIHNpbmdsZSBnZXQgb2Ygc2FtZSBhcnJheS4KLQkJYXJyYXlQcm94eS5zZXQoYW5JbnQsIG5ldyBpbnRbXSB7MCwxfSk7Ci0JCWFzc2VydEVxdWFscyhhbkludCwgaWR4MS5nZXQoMSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheVNuYXBzaG90MkRpbUFycmF5KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIsIDIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgbmV3IGludFtdIHsyLCAzfSk7Ci0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0KLQkJLy8gR2V0IHRoZSB0d28gZW50cmllcyB3aGljaCBhcmUgSW50ZWdlclszXQkJCi0JCUlBcnJheUJlYW5Qcm94eSBpZHgwID0gKElBcnJheUJlYW5Qcm94eSkgYXJyYXlQcm94eS5nZXQoMCk7Ci0JCUlBcnJheUJlYW5Qcm94eSBpZHgxID0gKElBcnJheUJlYW5Qcm94eSkgYXJyYXlQcm94eS5nZXQoMSk7Ci0JCQotCQkvLyBOb3cgZ2V0IHRoZSBzbmFwc2hvdCBhbmQgc2VlIGlmIHRoZSBlbnRyaWVzIGFyZSBpZHgwIGFuZCBpZHgxLgotCQlJQmVhblByb3h5W10gc25hcHNob3QgPSBhcnJheVByb3h5LmdldFNuYXBzaG90KCk7Ci0JCWFzc2VydEVxdWFscyhpZHgwLCBzbmFwc2hvdFswXSk7Ci0JCWFzc2VydEVxdWFscyhpZHgxLCBzbmFwc2hvdFsxXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5U25hcHNob3RQcmltaXRpdmVBcnJheSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiaW50IiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheVByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXlUeXBlLCBuZXcgaW50W10gezJ9KTsKLQkJYXNzZXJ0Tm90TnVsbChhcnJheVByb3h5KTsKLQotCQkvLyBTZXQgdGhlIHR3byBlbnRyaWVzIHRvIGludCB2YWx1ZXMuCi0JCWFycmF5UHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDIpLCAwKTsKLQkJYXJyYXlQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMyksIDEpOwotCQlJSW50ZWdlckJlYW5Qcm94eSBpZHgwID0gKElJbnRlZ2VyQmVhblByb3h5KSBhcnJheVByb3h5LmdldCgwKTsKLQkJSUludGVnZXJCZWFuUHJveHkgaWR4MSA9IChJSW50ZWdlckJlYW5Qcm94eSkgYXJyYXlQcm94eS5nZXQoMSk7Ci0JCWFzc2VydEVxdWFscygyLCBpZHgwLmludFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgaWR4MS5pbnRWYWx1ZSgpKTsKLQkJCi0JCS8vIE5vdyBnZXQgdGhlIHNuYXBzaG90IGFuZCBzZWUgaWYgdGhlIGVudHJpZXMgYXJlIGlkeDAgYW5kIGlkeDEuCi0JCUlCZWFuUHJveHlbXSBzbmFwc2hvdCA9IGFycmF5UHJveHkuZ2V0U25hcHNob3QoKTsKLQkJYXNzZXJ0RXF1YWxzKGlkeDAsIHNuYXBzaG90WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKGlkeDEsIHNuYXBzaG90WzFdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlBcnJheSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSBhbiBlbXB0eSBvbmUgZGltZW5zaW9uYWwgYXJyYXkJCQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgbnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0JCWFzc2VydEVxdWFscygiW0xqYXZhLmxhbmcuSW50ZWdlcjsiLCBhcnJheVByb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygwLCBhcnJheVByb3h5LmdldExlbmd0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5MkRBcnJheSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIENyZWF0ZSBhbiBlbXRweSB0d28gZGltZW5zaW9uYWwgYXJyYXkJCQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAyKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChhcnJheVByb3h5KTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0xqYXZhLmxhbmcuSW50ZWdlcjsiLCBhcnJheVByb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygwLCBhcnJheVByb3h5LmdldExlbmd0aCgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MkRBcnJheSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIENyZWF0ZSBhIDJEIGFycmF5IHdpdGggdGhyZWUgZW1wdHkgZW50cmllcyBpbiBkaW0gMC4gCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheVByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIsIDIpLCAzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGFycmF5UHJveHkpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5UHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDMsIGFycmF5UHJveHkuZ2V0TGVuZ3RoKCkpOwotCQkvLyBBcnJheSBlbnRyeSBzaG91bGQgYmUgZW1wdHkuCi0JCUlBcnJheUJlYW5Qcm94eSBpZHgxID0gKElBcnJheUJlYW5Qcm94eSkgYXJyYXlQcm94eS5nZXQoMCk7Ci0JCWFzc2VydE51bGwoaWR4MSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUFycmF5KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJLy8gTWFrZSBzdXJlIHRoYXQgaWYgdGhlIGZpbmFsIGNvbXBvbmVudCB0eXBlIGlzIGFuCi0JCS8vIGludCAocHJpbWl0aXZlKSB0aGF0IHdlIGdldCBhIHByaW1pdGl2ZSBwcm94eSBiYWNrIGFuZCBub3QgYW4gSW50ZWdlciBvYmplY3QuCQkKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJpbnQiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5UHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDQ0KSwgMSk7Ci0JCUlCZWFuUHJveHkgaWR4MSA9IGFycmF5UHJveHkuZ2V0KDEpOwotCQlhc3NlcnROb3ROdWxsKGlkeDEpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGlkeDEuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDQ0LCAoKElJbnRlZ2VyQmVhblByb3h5KSBpZHgxKS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RXF1YWxzKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJLy8gVGVzdCB0aGF0IGFycmF5IGVxdWFscyB3b3JrcyAoZG9lcyBzZW1hbnRpYyBlcXVhbHMgYW5kIG5vdCBpZGVudGl0eSBlcXVhbHMpLgotCQlwcmltSW50RXF1YWxzKCk7Ci0JCXByaW1Cb29sRXF1YWxzKCk7Ci0JCXByaW1CeXRlRXF1YWxzKCk7Ci0JCXByaW1TaG9ydEVxdWFscygpOwotCQlwcmltQ2hhckVxdWFscygpOwotCQlwcmltRG91YmxlRXF1YWxzKCk7Ci0JCXByaW1GbG9hdEVxdWFscygpOwotCQlwcmltTG9uZ0VxdWFscygpOwotCQlvYmplY3RFcXVhbHMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByaW1JbnRFcXVhbHMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImludCIsIDEpOyAvLyROT04tTkxTLTEkCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheVByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXlUeXBlLCAzKTsKLQkJYXJyYXlQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoNDQpLCAxKTsKLQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkyUHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoNDQpLCAxKTsKLQotCQlhc3NlcnRUcnVlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7Ci0JCQotCQkvLyBjaGFuZ2UgdGhlIHZhbHVlIG9mIG9uZSBzbyBub3cgZGlmZmVyZW50LgotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoNTUpLCAxKTsKLQkJYXNzZXJ0RmFsc2UoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkyUHJveHkpKTsKLQkJCi0JCS8vIE9uZSBzaWRlIHRlc3QgdGhhdCBpZiBub3QgY29tcGF0aWJsZSBpdCBzaG91bGQgYmUgZmFsc2UuCi0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXkzVHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImxvbmciLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkzUHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheTNUeXBlLCAzKTsKLQkJYXJyYXkzUHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDQ0bCksIDEpOwotCQlhc3NlcnRGYWxzZShhcnJheVByb3h5LmVxdWFscyhhcnJheTNQcm94eSkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJpbUJvb2xFcXVhbHMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImJvb2xlYW4iLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5UHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpLCAxKTsKLQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkyUHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodHJ1ZSksIDEpOwotCi0JCWFzc2VydFRydWUoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkyUHJveHkpKTsKLQkJCi0JCS8vIGNoYW5nZSB0aGUgdmFsdWUgb2Ygb25lIHNvIG5vdyBkaWZmZXJlbnQuCi0JCWFycmF5MlByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSksIDEpOwotCQlhc3NlcnRGYWxzZShhcnJheVByb3h5LmVxdWFscyhhcnJheTJQcm94eSkpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW1CeXRlRXF1YWxzKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJieXRlIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheVByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgoYnl0ZSkgMyksIDEpOwotCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheTJQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5MlByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgoYnl0ZSkgMyksIDEpOwotCi0JCWFzc2VydFRydWUoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkyUHJveHkpKTsKLQkJCi0JCS8vIGNoYW5nZSB0aGUgdmFsdWUgb2Ygb25lIHNvIG5vdyBkaWZmZXJlbnQuCi0JCWFycmF5MlByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgoYnl0ZSkgNCksIDEpOwotCQlhc3NlcnRGYWxzZShhcnJheVByb3h5LmVxdWFscyhhcnJheTJQcm94eSkpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW1TaG9ydEVxdWFscygpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgic2hvcnQiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5UHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKChzaG9ydCkgMyksIDEpOwotCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheTJQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5MlByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgoc2hvcnQpIDMpLCAxKTsKLQotCQlhc3NlcnRUcnVlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7Ci0JCQotCQkvLyBjaGFuZ2UgdGhlIHZhbHVlIG9mIG9uZSBzbyBub3cgZGlmZmVyZW50LgotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoKHNob3J0KSA0KSwgMSk7Ci0JCWFzc2VydEZhbHNlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbUNoYXJFcXVhbHMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImNoYXIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5UHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKCdhJyksIDEpOwotCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheTJQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5MlByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgnYScpLCAxKTsKLQotCQlhc3NlcnRUcnVlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7Ci0JCQotCQkvLyBjaGFuZ2UgdGhlIHZhbHVlIG9mIG9uZSBzbyBub3cgZGlmZmVyZW50LgotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoJ2InKSwgMSk7Ci0JCWFzc2VydEZhbHNlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByaW1Eb3VibGVFcXVhbHMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImRvdWJsZSIsIDEpOyAvLyROT04tTkxTLTEkCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheVByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXlUeXBlLCAzKTsKLQkJYXJyYXlQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoNC4zZCksIDEpOwotCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheTJQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5MlByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCg0LjNkKSwgMSk7Ci0KLQkJYXNzZXJ0VHJ1ZShhcnJheVByb3h5LmVxdWFscyhhcnJheTJQcm94eSkpOwotCQkKLQkJLy8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBvbmUgc28gbm93IGRpZmZlcmVudC4KLQkJYXJyYXkyUHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDEwZCksIDEpOwotCQlhc3NlcnRGYWxzZShhcnJheVByb3h5LmVxdWFscyhhcnJheTJQcm94eSkpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW1GbG9hdEVxdWFscygpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiZmxvYXQiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5UHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDQuM2YpLCAxKTsKLQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkyUHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoNC4zZiksIDEpOwotCi0JCWFzc2VydFRydWUoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkyUHJveHkpKTsKLQkJCi0JCS8vIGNoYW5nZSB0aGUgdmFsdWUgb2Ygb25lIHNvIG5vdyBkaWZmZXJlbnQuCi0JCWFycmF5MlByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgxMGYpLCAxKTsKLQkJYXNzZXJ0RmFsc2UoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkyUHJveHkpKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmltTG9uZ0VxdWFscygpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgibG9uZyIsIDEpOyAvLyROT04tTkxTLTEkCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheVByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXlUeXBlLCAzKTsKLQkJYXJyYXlQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMWwpLCAxKTsKLQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkyUHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMWwpLCAxKTsKLQotCQlhc3NlcnRUcnVlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7Ci0JCQotCQkvLyBjaGFuZ2UgdGhlIHZhbHVlIG9mIG9uZSBzbyBub3cgZGlmZmVyZW50LgotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMmwpLCAxKTsKLQkJYXNzZXJ0RmFsc2UoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkyUHJveHkpKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBvYmplY3RFcXVhbHMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheVByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChuZXcgSW50ZWdlcigxKSksIDEpOwotCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheTJQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5MlByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChuZXcgSW50ZWdlcigxKSksIDEpOwotCi0JCWFzc2VydFRydWUoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkyUHJveHkpKTsKLQkJCi0JCS8vIGNoYW5nZSB0aGUgdmFsdWUgb2Ygb25lIHNvIG5vdyBkaWZmZXJlbnQuCi0JCWFycmF5MlByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChuZXcgSW50ZWdlcigyKSksIDEpOwotCQlhc3NlcnRGYWxzZShhcnJheVByb3h5LmVxdWFscyhhcnJheTJQcm94eSkpOwkJCi0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbnMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSB2ZWN0b3JUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLnV0aWwuVmVjdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJSUJlYW5Qcm94eSB2ZWN0b3JQcm94eSA9IHZlY3RvclR5cGUubmV3SW5zdGFuY2UoKTsKLQkJQ29sbGVjdGlvbkJlYW5Qcm94eVdyYXBwZXIgY29sID0gbmV3IENvbGxlY3Rpb25CZWFuUHJveHlXcmFwcGVyKHZlY3RvclByb3h5KTsKLQkJCi0JCS8vIFRlc3QgYWRkaW5nCi0JCWFzc2VydFRydWUoY29sLmFkZChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgzMykpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbC5zaXplKCkpOwotCQkJCi0JCS8vIFRlc3QgdG9BcnJheSwgZmlyc3QgZW50cnkgc2hvdWxkIGJlIDMzIGFuZCBsZW5ndGggc2hvdWxkIGJlIDEuCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheU91dCA9IGNvbC50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxLCBhcnJheU91dC5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygzMywgKChJSW50ZWdlckJlYW5Qcm94eSkgYXJyYXlPdXQuZ2V0KDApKS5pbnRWYWx1ZSgpKTsKLQkJCi0JCS8vIFRlc3QgdG9BcnJheShhcnJheSkuCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheUludG8gPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheU91dC5nZXRUeXBlUHJveHkoKSwgYXJyYXlPdXQuZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheU91dDIgPSBjb2wudG9BcnJheShhcnJheUludG8pOwotCQkvLyBJdCBzaG91bGQgb2YgYmVlbiB0aGUgZXhhY3Qgc2FtZSBhcnJheSAoYXJyYXlJbnRvID09IGFycmF5T3V0MiB1bmRlciB0aGUgcHJveGllcykuCi0JCWFzc2VydFRydWUoYXJyYXlJbnRvLnNhbWVBcyhhcnJheU91dDIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMzLCAoKElJbnRlZ2VyQmVhblByb3h5KSBhcnJheU91dC5nZXQoMCkpLmludFZhbHVlKCkpOwotCQkKLQkJLy8gVGVzdCBzZXR0aW5nIHdpdGggd3JvbmcgdHlwZSB0aHJvd3MgZXhjZXB0aW9uLgotCQl0cnkgewotCQkJLy8gVGVzdCB0aGUgc2V0dGluZyB3aXRoIHdyb25nIHR5cGUgdGhyb3dzIGFuIGV4Y2VwdGlvbgotCQkJY29sID0gbmV3IENvbGxlY3Rpb25CZWFuUHJveHlXcmFwcGVyKGFycmF5T3V0KTsKLQkJCWZhaWwoIkNsYXNzQ2FzdEV4Y2VwdGlvbiBzaG91bGQgb2YgYmVlbiB0aHJvd24uIik7Ci0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZiBoZXJlLCB0aGVuIHRoZSB0ZXN0IHdhcyBwYXNzZWQKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSB2ZWN0b3JUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLnV0aWwuVmVjdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJSUJlYW5Qcm94eSB2ZWN0b3JQcm94eSA9IHZlY3RvclR5cGUubmV3SW5zdGFuY2UoKTsKLQkJQ29sbGVjdGlvbkJlYW5Qcm94eVdyYXBwZXIgY29sID0gbmV3IENvbGxlY3Rpb25CZWFuUHJveHlXcmFwcGVyKHZlY3RvclByb3h5KTsKLQkJY29sLmFkZChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgzMykpOwkJCi0JCQotCQkvLyBTZWUgaWYgdGhlIGl0ZXJhdG9yIGludGVyZmFjZSB3b3Jrcy4KLQkJSXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyIGl0clByb3h5ID0gY29sLml0ZXJhdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoaXRyUHJveHkpOwotCQlpbnQgaXRlcmF0aW9ucyA9IDA7Ci0JCXdoaWxlIChpdHJQcm94eS5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdGlvbnMrKzsKLQkJCWFzc2VydFRydWUoaXRlcmF0aW9ucyA8IDIpOwotCQkJSUJlYW5Qcm94eSBpdHJWYWx1ZSA9IGl0clByb3h5Lm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygzMywgKChJSW50ZWdlckJlYW5Qcm94eSkgaXRyVmFsdWUpLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SW50ZXJmYWNlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgdmVjdG9yVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS51dGlsLlZlY3RvciIpOyAvLyROT04tTkxTLTEkCi0JCUlCZWFuUHJveHkgdmVjdG9yUHJveHkgPSB2ZWN0b3JUeXBlLm5ld0luc3RhbmNlKCk7Ci0JCQotCQkvLyBTZWUgaWYgdGhlIGxpc3QgaW50ZWZhY2Ugd29ya3MuCi0JCUxpc3RCZWFuUHJveHlXcmFwcGVyIGxpc3QgPSBuZXcgTGlzdEJlYW5Qcm94eVdyYXBwZXIodmVjdG9yUHJveHkpOwotCQlhc3NlcnRUcnVlKGxpc3QuYWRkKHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDMzKSkpOwkvLyBGaXJzdCBlbnRyeS4KLQkJbGlzdC5hZGQoMCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodHJ1ZSkpOwkvLyBOb3cgYmVjb21lcyBmaXJzdCBlbnRyeS4KLQkJYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsICgoSUJvb2xlYW5CZWFuUHJveHkpIGxpc3QuZ2V0KDApKS5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygzMywgKChJSW50ZWdlckJlYW5Qcm94eSkgbGlzdC5nZXQoMSkpLmludFZhbHVlKCkpOwkvLyBTd2FwcGVkIHRvIHNlY29uZCBlbnRyeSBkdWUgdG8gYWRkKDAsLi4uKQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3IoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSB2ZWN0b3JUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLnV0aWwuVmVjdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJSUJlYW5Qcm94eSB2ZWN0b3JQcm94eSA9IHZlY3RvclR5cGUubmV3SW5zdGFuY2UoKTsKLQkJTGlzdEJlYW5Qcm94eVdyYXBwZXIgbGlzdCA9IG5ldyBMaXN0QmVhblByb3h5V3JhcHBlcih2ZWN0b3JQcm94eSk7Ci0JCWxpc3QuYWRkKHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDMzKSk7CS8vIEZpcnN0IGVudHJ5LgotCQlsaXN0LmFkZCgwLCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKSk7CS8vIE5vdyBiZWNvbWVzIGZpcnN0IGVudHJ5LgotCi0JCS8vIFNlZSBpZiB0aGUgTGlzdEl0ZXJhdG9yIGludGVyZmFjZSB3b3JrcwotCQlMaXN0SXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyIGxJdHJQcm94eSA9IGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwobEl0clByb3h5KTsKLQkJYXNzZXJ0VHJ1ZShsSXRyUHJveHkuaGFzTmV4dCgpKTsKLQkJSUJvb2xlYW5CZWFuUHJveHkgYm9vbDEgPSAoSUJvb2xlYW5CZWFuUHJveHkpIGxJdHJQcm94eS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBib29sMS5ib29sZWFuVmFsdWUoKSk7Ci0JCUlJbnRlZ2VyQmVhblByb3h5IGludDEgPSAoSUludGVnZXJCZWFuUHJveHkpIGxJdHJQcm94eS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygzMywgaW50MS5pbnRWYWx1ZSgpKTsJLy8gT2xkIGZpcnN0IGVudHJ5IG1vdmVkIHRvIHNlY29uZCBlbnRyeSBieSBhZGQoMCwuLi4pIGFib3ZlLgotCQlhc3NlcnRGYWxzZShsSXRyUHJveHkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGxJdHJQcm94eS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kQWNjZXNzb3JzKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBUZXN0IGFibGUgdG8gYWNjZXNzIGJlYW50eXBlIHByb3h5IGFuZCBpbnZva2UgbWV0aG9kcyBvbiBpdC4gVGhpcyBpc24ndAotCQkvLyB0aGUgYXBwcm92ZWQgd2F5IG9mIGdldHRpbmcgbWV0aG9kcywgYnV0IGl0IHRlc3RzIHRoYXQgbWV0aG9kIHByb3hpZXMKLQkJLy8gYXJlIGNyZWF0ZWQgY29ycmVjdGx5IGlmIHJldHVybmVkIGZyb20gYW4gaW52b2tlIG1ldGhvZC4KLQkJSUJlYW5UeXBlUHJveHkgY2xhc3NUeXBlUHJveHkgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5DbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCUlNZXRob2RQcm94eSBnZXRNZXRob2RNZXRob2QgPSBjbGFzc1R5cGVQcm94eS5nZXRNZXRob2RQcm94eSgiZ2V0TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLlN0cmluZyIsICJbTGphdmEubGFuZy5DbGFzczsifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCS8vIEdldCB0aGUgSW50ZWdlci5ieXRlVmFsdWUoKSBtZXRob2QgdGhyb3VnaCBhbiBpbnZva2UgaW5zdGVhZCBvZiBhIG1ldGhvZCBmYWN0b3J5IG9yIGJlYW4gdHlwZS4KLQkJSUJlYW5Qcm94eSBtZXRob2QgPSBnZXRNZXRob2RNZXRob2QuaW52b2tlKGludGVnZXJUeXBlLCBuZXcgSUJlYW5Qcm94eVtdIHsKLQkJCXByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKCJieXRlVmFsdWUiKSwgbnVsbH0pOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2QgaW5zdGFuY2VvZiBJTWV0aG9kUHJveHkpOwotCQkKLQkJLy8gTm93IGludm9rZSBpdCB0byBzZWUgaWYgY29ycmVjdCBhbnN3ZXIgY29tZXMgYmFjay4KLQkJSUJlYW5Qcm94eSBieXRlVmFsdWUgPSAoKElNZXRob2RQcm94eSkgbWV0aG9kKS5pbnZva2UocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IEludGVnZXIoMjU0KSkpOwotCQlhc3NlcnROb3ROdWxsKGJ5dGVWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZSIsIGJ5dGVWYWx1ZS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoKGJ5dGUpMjU0LCAoKElOdW1iZXJCZWFuUHJveHkpIGJ5dGVWYWx1ZSkuYnl0ZVZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW52b2thYmxlQWNjZXNzb3JzKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBUZXN0IGFibGUgdG8gYWNjZXNzIGJlYW50eXBlIHByb3h5IGFuZCBpbnZva2UgbWV0aG9kcyBvbiBpdC4gVGhpcyBpc24ndAotCQkvLyB0aGUgYXBwcm92ZWQgd2F5IG9mIGdldHRpbmcgbWV0aG9kcywgYnV0IGl0IHRlc3RzIHRoYXQgbWV0aG9kIHByb3hpZXMKLQkJLy8gYXJlIGNyZWF0ZWQgY29ycmVjdGx5IGlmIHJldHVybmVkIGZyb20gYW4gaW52b2tlIG1ldGhvZC4KLQkJSUJlYW5UeXBlUHJveHkgY2xhc3NUeXBlUHJveHkgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5DbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCUlJbnZva2FibGUgZ2V0TWV0aG9kSW52b2thYmxlID0gY2xhc3NUeXBlUHJveHkuZ2V0SW52b2thYmxlKCJnZXRNZXRob2QiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuU3RyaW5nIiwgIltMamF2YS5sYW5nLkNsYXNzOyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJLy8gR2V0IHRoZSBJbnRlZ2VyLmJ5dGVWYWx1ZSgpIG1ldGhvZCB0aHJvdWdoIGFuIGludm9rZSBpbnN0ZWFkIG9mIGEgbWV0aG9kIGZhY3Rvcnkgb3IgYmVhbiB0eXBlLgotCQlJQmVhblByb3h5IG1ldGhvZCA9IGdldE1ldGhvZEludm9rYWJsZS5pbnZva2UoaW50ZWdlclR5cGUsIG5ldyBJQmVhblByb3h5W10gewotCQkJcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoImJ5dGVWYWx1ZSIpLCBudWxsfSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQlhc3NlcnRUcnVlKG1ldGhvZCBpbnN0YW5jZW9mIElNZXRob2RQcm94eSk7Ci0JCQotCQkvLyBOb3cgaW52b2tlIGl0IHRvIHNlZSBpZiBjb3JyZWN0IGFuc3dlciBjb21lcyBiYWNrLgotCQlJQmVhblByb3h5IGJ5dGVWYWx1ZSA9ICgoSU1ldGhvZFByb3h5KSBtZXRob2QpLmludm9rZShwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChuZXcgSW50ZWdlcigyNTQpKSk7Ci0JCWFzc2VydE5vdE51bGwoYnl0ZVZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlIiwgYnl0ZVZhbHVlLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygoYnl0ZSkyNTQsICgoSU51bWJlckJlYW5Qcm94eSkgYnl0ZVZhbHVlKS5ieXRlVmFsdWUoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FsbGJhY2soKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLSBTdGFydGluZyB0aGUgY2FsbGJhY2sgdGVzdCAtLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlJQmVhblR5cGVQcm94eSBjYWxsYmFja1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS52bS5UZXN0Q2FsbGJhY2siKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGNhbGxiYWNrVHlwZSk7Ci0JCU9iamVjdCB0ZXN0T2JqZWN0ID0gbmV3IE9iamVjdCgpOwotCQlJQmVhblByb3h5IGNhbGxiYWNrUHJveHkgPSBjYWxsYmFja1R5cGUubmV3SW5zdGFuY2UoKTsKLQkJVGVzdENhbGxiYWNrIGNiID0gbmV3IFRlc3RDYWxsYmFjayh0ZXN0T2JqZWN0LCByZWdpc3RyeSk7Ci0JCXJlZ2lzdHJ5LmdldENhbGxiYWNrUmVnaXN0cnkoKS5yZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrUHJveHksIGNiKTsKLQkJSUludm9rYWJsZSBzdGFydCA9IGNhbGxiYWNrVHlwZS5nZXRJbnZva2FibGUoInN0YXJ0Iik7CS8vJE5PTi1OTFMtMSQKLQkJSUludm9rYWJsZSBzdG9wID0gY2FsbGJhY2tUeXBlLmdldEludm9rYWJsZSgic3RvcCIpOwkvLyROT04tTkxTLTEkCi0JCXN5bmNocm9uaXplZCh0ZXN0T2JqZWN0KSB7Ci0JCQlzdGFydC5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoY2FsbGJhY2tQcm94eSk7Ci0JCQl0cnkgewotCQkJCXRlc3RPYmplY3Qud2FpdCgzMDAwMCk7CS8vIFNob3VsZCBiZSBkb25lIGJ5IDMwIHNlY29uZHMuCi0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0JCQkJCi0JCXN0b3AuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKGNhbGxiYWNrUHJveHkpOwotCQlyZWdpc3RyeS5nZXRDYWxsYmFja1JlZ2lzdHJ5KCkuZGVyZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrUHJveHkpOwkJCQkKLQkJY2IudGVzdENvbXBsZXRlZCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIklmIHRoZXJlIGlzIGFueXRoaW5nIGluIHRoZSAubG9nIGZpbGUsIHRoZW4gdGhlIHRlc3QgZmFpbGVkLiIpOwkJCSAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbGxiYWNrU3RyZWFtKCkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBJT0V4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tIFN0YXJ0aW5nIHRoZSBjYWxsYmFjayBzdHJlYW0gdGVzdCAtLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlJQmVhblR5cGVQcm94eSBjYWxsYmFja1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS52bS5UZXN0Q2FsbGJhY2tTdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGNhbGxiYWNrVHlwZSk7Ci0JCU9iamVjdCB0ZXN0T2JqZWN0ID0gbmV3IE9iamVjdCgpOwotCQlJQmVhblByb3h5IGNhbGxiYWNrUHJveHkgPSBjYWxsYmFja1R5cGUubmV3SW5zdGFuY2UoKTsKLQkJVGVzdENhbGxiYWNrU3RyZWFtIGNiID0gbmV3IFRlc3RDYWxsYmFja1N0cmVhbSh0ZXN0T2JqZWN0KTsKLQkJcmVnaXN0cnkuZ2V0Q2FsbGJhY2tSZWdpc3RyeSgpLnJlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2tQcm94eSwgY2IpOwotCQlJTWV0aG9kUHJveHkgc3RhcnQgPSBjYWxsYmFja1R5cGUuZ2V0TWV0aG9kUHJveHkoInN0YXJ0Iik7CQkJCQkJCSAvLyROT04tTkxTLTEkCi0JCXN5bmNocm9uaXplZCh0ZXN0T2JqZWN0KSB7CQkJCi0JCQlzdGFydC5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoY2FsbGJhY2tQcm94eSk7Ci0JCXRyeSB7Ci0JCQkJdGVzdE9iamVjdC53YWl0KDMwMDAwKTsJLy8gU2hvdWxkIGJlIGRvbmUgYnkgMzAgc2Vjb25kcy4KLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0JCi0JCX0JCQotCQlyZWdpc3RyeS5nZXRDYWxsYmFja1JlZ2lzdHJ5KCkuZGVyZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrUHJveHkpOwkJCQkKLQkJY2IudGVzdENvbXBsZXRlKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSWYgdGhlcmUgaXMgYW55dGhpbmcgaW4gdGhlIC5sb2cgZmlsZSwgdGhlbiB0aGUgdGVzdCBmYWlsZWQuIik7CQkJIC8vJE5PTi1OTFMtMSQJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlR2V0RmllbGQoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSBpbnRlZ2VyVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCi0JCS8vIEdldCB0aGUgcHVibGljIGZpZWxkLgotCQlJRmllbGRQcm94eSBmaWVsZCA9IGludGVnZXJUeXBlLmdldEZpZWxkUHJveHkoIk1BWF9WQUxVRSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoZmllbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVHZXREZWNsYXJlZEZpZWxkKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBHZXQgdGhlIHB1YmxpYyBmaWVsZC4KLQkJSUZpZWxkUHJveHkgZmllbGQgPSBpbnRlZ2VyVHlwZS5nZXREZWNsYXJlZEZpZWxkUHJveHkoInZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChmaWVsZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEZpZWxkcygpIHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdEFjY2Vzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCi0JCS8vIEdldCBhbGwgZmllbGRzLgotCQlJRmllbGRQcm94eVtdIGZpZWxkcyA9IHRlc3RBY2Nlc3NUeXBlLmdldEZpZWxkcygpOwotCQlhc3NlcnROb3ROdWxsKGZpZWxkcyk7Ci0JCWFzc2VydEVxdWFscygyLCBmaWVsZHMubGVuZ3RoKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWNsYXJlZEZpZWxkcygpIHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdEFjY2Vzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCi0JCS8vIEdldCBhbGwgZmllbGRzLgotCQlJRmllbGRQcm94eVtdIGZpZWxkcyA9IHRlc3RBY2Nlc3NUeXBlLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWFzc2VydE5vdE51bGwoZmllbGRzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZpZWxkcy5sZW5ndGgpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVHZXRNZXRob2QoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0QWNjZXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOyAvLyROT04tTkxTLTEkCQotCQkKLQkJLy8gR2V0IHRoZSBwdWJsaWMgZmllbGQuCi0JCUlNZXRob2RQcm94eSBtZXRob2QgPSB0ZXN0QWNjZXNzVHlwZS5nZXRNZXRob2RQcm94eSgieHl6Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVHZXREZWNsYXJlZE1ldGhvZCgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RBY2Nlc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7IC8vJE5PTi1OTFMtMSQJCi0JCQotCQkvLyBHZXQgdGhlIHB1YmxpYyBmaWVsZC4KLQkJSU1ldGhvZFByb3h5IG1ldGhvZCA9IHRlc3RBY2Nlc3NUeXBlLmdldERlY2xhcmVkTWV0aG9kUHJveHkoInF4ciIsIChTdHJpbmdbXSkgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXRob2RzKCkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0QWNjZXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOyAvLyROT04tTkxTLTEkCi0JCUlCZWFuVHlwZVByb3h5IHRlc3RPYmplY3RUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIEdldCBhbGwgbWV0aG9kcy4gTmVlZCB0byBnZXQgYWxsIG9mIE9iamVjdCB0b28gc2luY2UgZ2V0TWV0aG9kcygpIGdldHMgdGhlbSBhbGwgaW5jbHVkaW5nIGluaGVyaXRlZC4gV2Ugd2lsbAotCQkvLyB0aGVuIHRha2UgdGhlIGRpZmYgdG8gc2hvdyB3aGF0J3Mgb25seSBhdCB0aGUgbG9jYWwgbGV2ZWwuCi0JCUlNZXRob2RQcm94eVtdIG1ldGhvZHMgPSB0ZXN0QWNjZXNzVHlwZS5nZXRNZXRob2RzKCk7Ci0JCUlNZXRob2RQcm94eVtdIG9iamVjdE1ldGhvZHMgPSB0ZXN0T2JqZWN0VHlwZS5nZXRNZXRob2RzKCk7Ci0JCWFzc2VydE5vdE51bGwobWV0aG9kcyk7Ci0JCWFzc2VydE5vdE51bGwob2JqZWN0TWV0aG9kcyk7Ci0JCWFzc2VydEVxdWFscyg3LCBtZXRob2RzLmxlbmd0aC1vYmplY3RNZXRob2RzLmxlbmd0aCk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVjbGFyZWRNZXRob2RzKCkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0QWNjZXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkKLQkJLy8gR2V0IGFsbCBmaWVsZHMuCi0JCUlNZXRob2RQcm94eVtdIG1ldGhvZHMgPSB0ZXN0QWNjZXNzVHlwZS5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RzKTsKLQkJYXNzZXJ0RXF1YWxzKDgsIG1ldGhvZHMubGVuZ3RoKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kQ29tcGF0aWJsZUNvbnN0cnVjdG9yKCkgdGhyb3dzIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdEFjY2Vzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQotCQlJQ29uc3RydWN0b3JQcm94eSBjdG9yID0gdGVzdEFjY2Vzc1R5cGUuZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKG5ldyBJQmVhblR5cGVQcm94eVtdIHtwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5BcnJheVN0b3JlRXhjZXB0aW9uIil9KTsKLQkJSUNvbnN0cnVjdG9yUHJveHkgY29tcCA9IHRlc3RBY2Nlc3NUeXBlLmdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShuZXcgSUJlYW5UeXBlUHJveHlbXSB7cHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpfSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGN0b3IpOwotCQlhc3NlcnROb3ROdWxsKGNvbXApOwotCQlhc3NlcnRFcXVhbHMoY3RvciwgY29tcCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kQ29tcGF0aWJsZU1ldGhvZCgpIHRocm93cyBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RBY2Nlc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0KLQkJSU1ldGhvZFByb3h5IG1ldGhvZCA9IHRlc3RBY2Nlc3NUeXBlLmdldENvbXBhdGlibGVNZXRob2QoInh5eiIsIG5ldyBJQmVhblR5cGVQcm94eVtdIHtwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIil9KTsKLQkJSU1ldGhvZFByb3h5IGNvbXAgPSB0ZXN0QWNjZXNzVHlwZS5nZXREZWNsYXJlZE1ldGhvZFByb3h5KCJ4eXoiLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7cHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuTnVtYmVyIil9KTsKLQkJCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJYXNzZXJ0Tm90TnVsbChjb21wKTsKLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZCwgY29tcCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kQW1iaWd1b3VzTWV0aG9kKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RBY2Nlc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0KLQkJdHJ5IHsKLQkJCXRlc3RBY2Nlc3NUeXBlLmdldENvbXBhdGlibGVNZXRob2QoImRkZCIsIG5ldyBJQmVhblR5cGVQcm94eVtdIHtwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIiksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKX0pOwotCQkJZmFpbCgiU2hvdWxkIG9mIGJlZW4gYW1iaWd1b3VzIik7Ci0JCX0gY2F0Y2ggKEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCX0gCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaWRlL0lERVByb3h5U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2lkZS9JREVQcm94eVN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZTMzZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaWRlL0lERVByb3h5U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERVByb3h5U3VpdGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NSAkIAotICovCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERVJlZ2lzdHJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuQWJzdHJhY3RUZXN0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LlByb3h5U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqIFRoaXMgaXMgdGhlIHRydWUgdGVzdCBzdWl0ZSBmb3IgUmVtb3RlIFByb3h5IFRlc3RpbmcuIFRoZSBSZW1vdGVQcm94eVRlc3Qgd2lsbCB1c2UgdGhpcy4KLSAqLwotcHVibGljIGNsYXNzIElERVByb3h5U3VpdGUgZXh0ZW5kcyBUZXN0U2V0dXAgewotCi0JLy8gVGVzdCBjYXNlcyB0byBiZSBpbmNsdWRlIGluIHRoZSBzdWl0ZQotCXByaXZhdGUgc3RhdGljIENsYXNzIHRlc3RzTGlzdFtdID0geyBQcm94eVN1aXRlLmNsYXNzLCB9OwotCi0JcHJpdmF0ZSBBYnN0cmFjdFRlc3RQcm94eS5SZWdpc3RyeUhhbmRsZXIgcmVnaXN0cnlIYW5kbGVyID0gbmV3IEFic3RyYWN0VGVzdFByb3h5LlJlZ2lzdHJ5SGFuZGxlcigpIHsKLQkJcHJpdmF0ZSBQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeTsKLQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJaWYgKHJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCQlyZWdpc3RyeSA9IElERVJlZ2lzdHJhdGlvbi5zdGFydEFuSW1wbGVtZW50YXRpb24obmV3IElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSB7IFByb3h5U3VpdGUuZ2V0UHJveHlTdWl0ZUNvbnRyaWJ1dG9yKCl9LCB0cnVlLCBudWxsLCAiSlVuaXQgVGVzdHMgZm9yIElERSBQcm94eSIsICJvcmcuZWNsaXBzZS5qZW0udGVzdHMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm4gcmVnaXN0cnk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkZXN0cm95UmVnaXN0cnkoKSB7Ci0JCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotCQkJCXJlZ2lzdHJ5LnRlcm1pbmF0ZVJlZ2lzdHJ5KCk7Ci0JCQkJcmVnaXN0cnkgPSBudWxsOwotCQkJfQotCQl9Ci0JfTsKLQotCXB1YmxpYyBJREVQcm94eVN1aXRlKCkgewotCQl0aGlzKCJUZXN0IElERSBQcm94eSBTdWl0ZSIpOwotCX0KLQotCXB1YmxpYyBJREVQcm94eVN1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5ldyBUZXN0U3VpdGUobmFtZSkgewotCQkJewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHNMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCS8vIFdlIG1heSBnZXQgc29tZSB0ZXN0cyBhbmQgc3VpdGVzLgotCQkJCQlpZiAoVGVzdFN1aXRlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGVzdHNMaXN0W2ldKSB8fCBUZXN0U2V0dXAuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0ZXN0c0xpc3RbaV0pKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVRlc3QgdHMgPSAoVGVzdCkgdGVzdHNMaXN0W2ldLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJYWRkVGVzdCh0cyk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZQotCQkJCQkJYWRkVGVzdFN1aXRlKHRlc3RzTGlzdFtpXSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0pOwotCi0JCUFic3RyYWN0VGVzdFByb3h5LmluaXRSZWdpc3RyeUhhbmRsZXIoKFRlc3RTdWl0ZSkgZ2V0VGVzdCgpLCByZWdpc3RyeUhhbmRsZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBJREVQcm94eVN1aXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmVnaXN0cnlIYW5kbGVyLmRlc3Ryb3lSZWdpc3RyeSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9BYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9BYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODRhZTBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgdGVzdCBoZWxwZXIgZm9yIGFsbCBvZiB0aGUgdGVzdHMgd2l0aGluIHRoZSBnaXZlbiBzdWl0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3VpdGUKLQkgKiBAcGFyYW0gdGVzdEhlbHBlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0U3VpdGUoVGVzdFN1aXRlIHN1aXRlLCBBYnN0cmFjdEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIHRlc3RIZWxwZXIpIHsKLQkJRW51bWVyYXRpb24gdGVzdHMgPSBzdWl0ZS50ZXN0cygpOwotCQl3aGlsZSAodGVzdHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVRlc3QgdGVzdCA9IChUZXN0KSB0ZXN0cy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKHRlc3QgaW5zdGFuY2VvZiBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSkKLQkJCQkoKEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlKSB0ZXN0KS5zZXRUZXN0SGVscGVyKHRlc3RIZWxwZXIpOwotCQkJZWxzZSBpZiAodGVzdCBpbnN0YW5jZW9mIFRlc3RTdWl0ZSkKLQkJCQlpbml0U3VpdGUoKFRlc3RTdWl0ZSkgdGVzdCwgdGVzdEhlbHBlcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciB0ZXN0SGVscGVyOwotCQotCS8qKgotCSAqIFNldCB0aGUgdGVzdCBoZWxwZXIgdG8gdXNlLgotCSAqIAotCSAqIEBwYXJhbSB0ZXN0SGVscGVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVzdEhlbHBlcihBYnN0cmFjdEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIHRlc3RIZWxwZXIpIHsKLQkJdGhpcy50ZXN0SGVscGVyID0gdGVzdEhlbHBlcjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0Fic3RyYWN0SW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQWJzdHJhY3RJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODY5YTIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQWJzdHJhY3RJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQWJzdHJhY3RJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBpbml0IHN0cmluZyBwYXJzZXIgaGVscGVyLiBBbGxvd3MgIkluaXRTdHJpbmcgUGFyc2VyIiBvciAiQVNUIFBhcnNlciIgb3Igc29tZSBvdGhlciBraW5kIG9mIHRlc3RpbmcuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciB7Ci0JLyoqCi0JICogVGVzdCB0aGUgZ2l2ZW4gc3RyaW5nIGFnYWluc3QgdGhlIGdpdmVuIHJlc3VsdC4gZXF1YWxzT25seSBkZXRlcm1pbmVzIGhvdyBleGFjdGx5IGl0IG1hdGNoZXMuCi0JICogSWYgYWxsb3dlZCB0byB0aHJvdyBleGNlcHRpb25zLCB0aGVuIHRoZSBleGNlcHRpb24gYXMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW9uIHdpbGwgYmUgc3F1YXNoZWQuCi0JICogCi0JICogQHBhcmFtIGFTdHJpbmcKLQkgKiBAcGFyYW0gZXhwZWN0ZWRSZXN1bHQKLQkgKiBAcGFyYW0gdGhyb3dzRXhjZXB0aW9uIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgZXhwZWN0ZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBzdWNoIGV4Y2VwdGlvbiB3aWxsIG5vdCBiZSBwYXNzZWQgb24gb3V0IGFuZCB3aWxsIHJldHVybiBub3JtYWwuCi0JICogQHBhcmFtIGVxdWFsc09ubHkgPGNvZGU+dHJ1ZTwvY29kZT4gbWVhbnMgaWYgbXVzdCBtYXRjaCBlaXRoZXIgPT0sIGVxdWFscygpLCBvciB0b1N0cmluZygpJ3MgbWF0Y2guCi0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0ZXN0SW5pdFN0cmluZyhTdHJpbmcgYVN0cmluZywgT2JqZWN0IGV4cGVjdGVkUmVzdWx0LCBib29sZWFuIHRocm93c0V4Y2VwdGlvbiwgYm9vbGVhbiBlcXVhbHNPbmx5KQotCQl0aHJvd3MgVGhyb3dhYmxlOwotCi0JLyoqCi0JICogVGVzdCB0aGUgZ2l2ZW4gc3RyaW5nIGFnYWluc3QgdGhlIGdpdmVuIHJlc3VsdC4gSXQgbXVzdCBtYXRjaCBlaXRoZXIgPT0sIGVxdWFscygpLCBvciB0b1N0cmluZygpJ3MgbWF0Y2guCi0JICogSXQgc2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb25zLiBJZiBpdCBkb2VzLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcGFzc2VkIG91dC4KLQkgKiAKLQkgKiBAcGFyYW0gYVN0cmluZwotCSAqIEBwYXJhbSBleHBlY3RlZFJlc3VsdAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbml0U3RyaW5nKFN0cmluZyBhU3RyaW5nLCBPYmplY3QgZXhwZWN0ZWRSZXN1bHQpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SW5pdFN0cmluZyhhU3RyaW5nLCBleHBlY3RlZFJlc3VsdCwgZmFsc2UsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIGdpdmVuIHN0cmluZyBhZ2FpbnN0IHRoZSBnaXZlbiByZXN1bHQuIGVxdWFsc09ubHkgZGV0ZXJtaW5lcyBob3cgZXhhY3RseSBpdCBtYXRjaGVzCi0JICogSXQgc2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb25zLiBJZiBpdCBkb2VzLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcGFzc2VkIG91dC4KLQkgKiAKLQkgKiBAcGFyYW0gYVN0cmluZwotCSAqIEBwYXJhbSBlcXVhbHNPbmx5IDxjb2RlPnRydWU8L2NvZGU+IG1lYW5zIGlmIG11c3QgbWF0Y2ggZWl0aGVyID09LCBlcXVhbHMoKSwgb3IgdG9TdHJpbmcoKSdzIG1hdGNoLgotCSAqIEBwYXJhbSBleHBlY3RlZFJlc3VsdAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluaXRTdHJpbmcoU3RyaW5nIGFTdHJpbmcsIGJvb2xlYW4gZXF1YWxzT25seSwgT2JqZWN0IGV4cGVjdGVkUmVzdWx0KSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEluaXRTdHJpbmcoYVN0cmluZywgZXhwZWN0ZWRSZXN1bHQsIGZhbHNlLCBlcXVhbHNPbmx5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0FycmF5Q29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0FycmF5Q29uc3RydWN0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYzJlMGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9BcnJheUNvbnN0cnVjdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBBcnJheUNvbnN0cnVjdG9yVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheUNvbnN0cnVjdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcnJheUNvbnRydWN0b3JUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEFycmF5Q29uc3RydWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5U3RyaW5nMUQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IFN0cmluZ1syXSIsbmV3IFN0cmluZ1syXSk7CQotICAgIH0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJpbmcyRCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgU3RyaW5nWzJdWzJdIixuZXcgU3RyaW5nWzJdWzJdKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUNvbG9yMUQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEuYXd0LkNvbG9yWzNdIixuZXcgamF2YS5hd3QuQ29sb3JbM10pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEVtcHR5Q29sb3IyRCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5hd3QuQ29sb3JbM11bNF0iLG5ldyBqYXZhLmF3dC5Db2xvclszXVs0XSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGludFszXSIsIG5ldyBpbnRbM10pOwkKLQl9Ci0JCi0JLy8gVE9ETzogZW5hYmxlIHRoaXMgdGVzdCB3aGVuIHRoaXMgd29ya3MKLQkvKgotCXB1YmxpYyB2b2lkIHRlc3RDYWxjdWxhdGVkU2l6ZSgpIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IFN0cmluZ1tuZXcgSW50ZWdlcigzKS5pbnRWYWx1ZSgpXSIsbmV3IFN0cmluZ1tuZXcgSW50ZWdlcigzKS5pbnRWYWx1ZSgpXSk7ICAgIAkKLQl9Ci0JKi8KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZWRJbnRzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBpbnRbXSB7LTIsM30iLG5ldyBpbnRbXXstMiwzfSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZWRJbnRzVHJhaWxpbmdDb21tYSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgaW50W10gey0yLDMsfSIsbmV3IGludFtdey0yLDMsfSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplZERvdWJsZVBhcmVucygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgZG91YmxlW10geygtMiksIDMuMCB9IixuZXcgZG91YmxlW10geygtMiksIDMuMCB9KTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplZFN0cmluZ3NUd28oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IFN0cmluZ1tdIHtcIjFcIixcIjJcIn0iLG5ldyBTdHJpbmdbXSB7IjEiLCIyIn0pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVkU3RyaW5nc1RocmVlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBTdHJpbmdbXSB7XCJGcm9nXCIsXCJEb2dcIixcIkNvd1wifSIsbmV3IFN0cmluZ1tdIHsiRnJvZyIsIkRvZyIsIkNvdyJ9KTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplZENvbG9ycygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5hd3QuQ29sb3JbXSB7IGphdmEuYXd0LkNvbG9yLnJlZCAsIG5ldyBqYXZhLmF3dC5Db2xvcigwLDAsMCkgfSIsbmV3IGphdmEuYXd0LkNvbG9yW10geyBqYXZhLmF3dC5Db2xvci5yZWQgLCBuZXcgamF2YS5hd3QuQ29sb3IoMCwwLDApIH0pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEluaXRhbGl6ZWRJbnRzMkQxKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBpbnRbXVtdIHsgeyAyICwgLTMgfSAsIHsgNCAsIDUgfSB9IixuZXcgaW50W11bXSB7IHsgMiAsIC0zIH0gLCB7IDQgLCA1IH0gfSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGFsaXplZEludHMyRDIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGludFtdW10ge3sxLDIsM30sezQsNSw2fX0iLG5ldyBpbnRbXVtde3sxLDIsM30sezQsNSw2fX0pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEluaXRhbGl6ZWRJbnRzMkRQYXJlbnNDb21tYXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJLy8gTXVjaCB0byBteSBzdXJwcmlzZSwgZXh0cmEgY29tbWFuZHMgYXJlIHZhbGlkIHN5bnRheCBhdCB0aGUgZW5kIG9mIHRoZSBhcmd1bWVudHMgZXZlbiB3aXRob3V0IGFueSBmb2xsb3dpbmcgYXJndW1lbnQKLQkJLy8gdGhlIHJlc29sdmUgdGhhdCBvY2N1cnMgYnkgdGhlIFZpc3VhbCBFZGl0b3IgYWN0dWFsbHkgaW5zZXJ0cyB0aGVzZSwgc28gd2UgbmVlZCB0ZXN0cyB0byBtYWtlIHN1cmUgd2UgY2FuIGRlYWwgd2l0aCB0aGVtIGNvcnJlY3RseQotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgaW50W11bXSB7IHsyICwoLTMpLH0gLCB7IDQgLCA1LH19IixuZXcgaW50W11bXSB7IHsgMiAsICgtMyksfSAsIHsgNCAsIDUsfX0pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEluaXRhbGl6ZWRJbnRzMkRQYXJlbnNDb21tYXMyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBpbnRbXVtdIHsgezIgLCgtMyksfSAsIHsgNCAsIDUsfSx9IixuZXcgaW50W11bXSB7IHsgMiAsICgtMyksfSAsIHsgNCAsIDUsfSx9KTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbml0YWxpemVkRG91YmxlczJEKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBkb3VibGVbXVtdIHsgeyAyICwgMyB9ICwgeyA0ICwgNSB9IH0iLG5ldyBkb3VibGVbXVtdIHsgeyAyICwgMyB9ICwgeyA0ICwgNSB9IH0pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEluaXRhbGl6ZWREb3VibGVzMkRNYW55KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBkb3VibGVbXVtde3sgNS4wLCAtMi4wLCA1LjAsIC0xLjAsIC0xLjAsIDUuMCwgLTIuMCwgNS4wIH0sIHsgNS4wLCAtMi4wLCA1LjAsIC0yLjAsIDUuMCwgLTEuMCwgNS4wLCAtMi4wLCA1LjAgfX0iLG5ldyBkb3VibGVbXVtde3sgNS4wLCAtMi4wLCA1LjAsIC0xLjAsIC0xLjAsIDUuMCwgLTIuMCwgNS4wIH0sIHsgNS4wLCAtMi4wLCA1LjAsIC0yLjAsIDUuMCwgLTEuMCwgNS4wLCAtMi4wLCA1LjAgfX0pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEludDJEUGFyYW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBpbnRbXVtdIHt7MSwyLDN9LHszLDQsNX19KSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBpbnRbXVtdIHt7MSwyLDN9LHszLDQsNX19KSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50MkRQYXJhbUNvbW1hcygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGludFtdW10ge3sxLDIsMyx9LHszLDQsNSx9fSkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgaW50W11bXSB7ezEsMiwzLH0sezMsNCw1LH19KSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50MkRQYXJhbUNvbW1hczIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBpbnRbXVtdIHt7MSwyLDMsfSx7Myw0LDUsfSx9KSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBpbnRbXVtdIHt7MSwyLDMsfSx7Myw0LDUsfSx9KSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUGFyYW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBkb3VibGVbXXsxLDIsM30pIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdezEsMiwzfSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERvdWJsZVBhcmFtMigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdezEuMCwyLC0zLjV9KSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBkb3VibGVbXXsxLjAsMiwtMy41fSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERvdWJsZVBhcmFtMygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdey0xLDIsLTAuNX0pIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdey0xLDIsLTAuNX0pKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGUyRFBhcmFtKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCS8vIFRoaXMgdGVzdCBpcyBvbmUgdGhhdCBpcyBzaW1pbGFyIHRvIHRoZSB0eXBlIG9mIGNvbnN0cnVjdG9yIHVzZWQgYnkgVGFibGVMYXlvdXQgZm9yIFNXQQotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdW117eyA1LjAsIC0yLjAsIDUuMCwgLTEuMCwgLTEuMCwgNS4wLCAtMi4wLCA1LjAgfSwgeyA1LjAsIC0yLjAsIDUuMCwgLTIuMCwgNS4wLCAtMS4wLCA1LjAsIC0yLjAsIDUuMCB9fSkiLAotCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBkb3VibGVbXVtde3sgNS4wLCAtMi4wLCA1LjAsIC0xLjAsIC0xLjAsIDUuMCwgLTIuMCwgNS4wIH0sIHsgNS4wLCAtMi4wLCA1LjAsIC0yLjAsIDUuMCwgLTEuMCwgNS4wLCAtMi4wLCA1LjAgfX0pKTsgICAgCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlMkRQYXJhbUNvbW1hcygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdW117eyA1LjAsIC0yLjAsIDUuMCwgLTEuMCwgLTEuMCwgNS4wLCAtMi4wLCA1LjAgLCB9LCB7IDUuMCwgLTIuMCwgNS4wLCAtMi4wLCA1LjAsIC0xLjAsIDUuMCwgLTIuMCwgNS4wICwgfSAsIH0pIiwKLQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdW117eyA1LjAsIC0yLjAsIDUuMCwgLTEuMCwgLTEuMCwgNS4wLCAtMi4wLCA1LjAgLCB9LCB7IDUuMCwgLTIuMCwgNS4wLCAtMi4wLCA1LjAsIC0xLjAsIDUuMCwgLTIuMCwgNS4wICwgfSAsIH0pKTsJCi0JfQotCQotCQotCS8vIFRPRE86IGVuYWJsZSB0aGlzIHRlc3Qgd2hlbiB0aGUgY2FzZSBpcyBoYW5kbGVkIHByb3Blcmx5Ci0JLyoKLQlwdWJsaWMgdm9pZCB0ZXN0SW50M0QoKSB7Ci0JCS8vIE5lZWRzIGZpeGluZyAtIFdlIGRvbid0IGhhdmUgZGltZW5zaW9ucyBncmVhdGVyIHRoYW4gMiB3b3JraW5nIHlldAotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgaW50W11bXVtdIHsgeyB7IDEgLCAyIH0gLCB7IDMgLCA0IH0gfSwgeyB7IDUgLCA2IH0gLCB7IDcgLCA4IH0gfSB9IixuZXcgaW50W11bXVtdIHsgeyB7IDEgLCAyIH0gLCB7IDMgLCA0IH0gfSwgeyB7IDUgLCA2IH0gLCB7IDcgLCA4IH0gfSB9KTsgICAgCQotCX0KLSAgICAqLwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9CbG9ja1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQmxvY2tUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZTdkNzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9CbG9ja1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogQmxvY2tUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCbG9ja1Rlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQmxvY2tUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotLyoKLSAqIFRPRE8gVGhlc2UgdGhyZWUgZG9uJ3Qgd29yayBmb3Igbm93LiBMYXRlciB0aGV5IG1heSBiZSBmaXhlZCBpZiBpdCBzaG93cyB1cCBhcyBhIGdlbmVyYWwgcHJvYmxlbSBmb3IgY3VzdG9tZXJzLiBTbyBmYXIgdGhleSBoYXZlbid0LgotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RWxlbWVudHMxKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkiKCgobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDMpKS5zZXRFbGVtQXQoXCJhY2NvdW50U3RhdGVtZW50RGV0YWlsc1wiLDApKS5zZXRFbGVtQXQobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKFwiT3BuQmFsYW5jZVwiLFwiT3BuQmFsYW5jZVwiLG51bGwsZmFsc2UsZmFsc2UsdHJ1ZSw1MCksMSkpLnNldEVsZW1BdChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoXCJPcG5EYXRlXCIsXCJPcG5EYXRlXCIsbnVsbCxmYWxzZSxmYWxzZSx0cnVlLDUwKSwyKTsiLAotCQkJKCgobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDMpKS5zZXRFbGVtQXQoImFjY291bnRTdGF0ZW1lbnREZXRhaWxzIiwwKSkuc2V0RWxlbUF0KG5ldyBOYXZpZ2F0aW9uUGFyYW1ldGVycygiT3BuQmFsYW5jZSIsIk9wbkJhbGFuY2UiLG51bGwsZmFsc2UsZmFsc2UsdHJ1ZSw1MCksMSkpLnNldEVsZW1BdChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoIk9wbkRhdGUiLCJPcG5EYXRlIixudWxsLGZhbHNlLGZhbHNlLHRydWUsNTApLDIpKTsgICAgCQotICAgIH0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RWxlbWVudHMyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkJIigoKG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygzKSkuc2V0RWxlbUF0KFwiYWNjb3VudFN0YXRlbWVudERldGFpbHNcIiwwKSkuc2V0RWxlbUF0KG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhcIk9wbkJhbGFuY2VcIixcIk9wbkJhbGFuY2VcIixudWxsLGZhbHNlLGZhbHNlLHRydWUsNTApLDEpKSIsCi0JCQkJKCgobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDMpKS5zZXRFbGVtQXQoImFjY291bnRTdGF0ZW1lbnREZXRhaWxzIiwwKSkuc2V0RWxlbUF0KG5ldyBOYXZpZ2F0aW9uUGFyYW1ldGVycygiT3BuQmFsYW5jZSIsIk9wbkJhbGFuY2UiLG51bGwsZmFsc2UsZmFsc2UsdHJ1ZSw1MCksMSkpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTZXRFbGVtZW50czMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSIoKG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygzKSkuc2V0RWxlbUF0KG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhcIk9wbkJhbGFuY2VcIixcIk9wbkJhbGFuY2VcIixudWxsLGZhbHNlLGZhbHNlLHRydWUsNTApLDEpKSIsCi0JCQkoKG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygzKSkuc2V0RWxlbUF0KG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygiT3BuQmFsYW5jZSIsIk9wbkJhbGFuY2UiLG51bGwsZmFsc2UsZmFsc2UsdHJ1ZSw1MCksMSkpKTsgICAgCQotCX0KLSovCi0JcHVibGljIHZvaWQgdGVzdFNldEVsZW1lbnQ0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkJIigobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDMpKS5zZXRFbGVtQXQoXCJhY2NvdW50U3RhdGVtZW50RGV0YWlsc1wiLDApKSIsCi0JCQkJKChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMykpLnNldEVsZW1BdCgiYWNjb3VudFN0YXRlbWVudERldGFpbHMiLDApKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUmVwbGFjZW1lbnQxKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkJIigoKG5ldyBTdHJpbmcoXCJGcm9nXCIpKS5yZXBsYWNlKCdvJywnaScpKS5yZXBsYWNlKCdpJywnYScpKS5yZXBsYWNlKCdhJywnbycpIiwKLQkJCQkoKChuZXcgU3RyaW5nKCJGcm9nIikpLnJlcGxhY2UoJ28nLCdpJykpLnJlcGxhY2UoJ2knLCdhJykpLnJlcGxhY2UoJ2EnLCdvJykpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1JlcGxhY2VtZW50MigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJCSIoKCgobmV3IFN0cmluZyhcIkZyb2dcIikpLnJlcGxhY2UoJ28nLCdpJykpLnJlcGxhY2UoJ2knLCdhJykpLnJlcGxhY2UoJ2EnLCdvJykpLnJlcGxhY2UoJ28nLCdlJykiLAotCQkJCSgoKChuZXcgU3RyaW5nKCJGcm9nIikpLnJlcGxhY2UoJ28nLCdpJykpLnJlcGxhY2UoJ2knLCdhJykpLnJlcGxhY2UoJ2EnLCdvJykpLnJlcGxhY2UoJ28nLCdlJykpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0Nhc2VzMSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJCSIobmV3IFN0cmluZyhcIkZyb2dcIikudG9Mb3dlckNhc2UoKSkudG9VcHBlckNhc2UoKSIsCi0JCQkJKG5ldyBTdHJpbmcoIkZyb2ciKS50b0xvd2VyQ2FzZSgpKS50b1VwcGVyQ2FzZSgpCi0JCQkJKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDYXNlczIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCQkiKChuZXcgU3RyaW5nKFwiRnJvZ1wiKS50b0xvd2VyQ2FzZSgpKS50b1VwcGVyQ2FzZSgpKS50b0xvd2VyQ2FzZSgpIiwKLQkJCQkoKG5ldyBTdHJpbmcoIkZyb2ciKS50b0xvd2VyQ2FzZSgpKS50b1VwcGVyQ2FzZSgpKS50b0xvd2VyQ2FzZSgpCi0JCQkJKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDYXNlczMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCQkiKCgobmV3IFN0cmluZyhcIkZyb2dcIikudG9Mb3dlckNhc2UoKSkudG9VcHBlckNhc2UoKSkudG9Mb3dlckNhc2UoKSkudG9VcHBlckNhc2UoKSIsCi0JCQkJKCgobmV3IFN0cmluZygiRnJvZyIpLnRvTG93ZXJDYXNlKCkpLnRvVXBwZXJDYXNlKCkpLnRvTG93ZXJDYXNlKCkpLnRvVXBwZXJDYXNlKCkKLQkJCQkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbmNhdDEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCQkiKG5ldyBTdHJpbmcoXCJGcm9nc1wiKS5jb25jYXQoXCJhcmVcIikpLmNvbmNhdChcImNvb2xcIikiLAotCQkJCShuZXcgU3RyaW5nKCJGcm9ncyIpLmNvbmNhdCgiYXJlIikpLmNvbmNhdCgiY29vbCIpCi0JCQkJKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25jYXQyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkJIigobmV3IFN0cmluZyhcIkZyb2dzXCIpLmNvbmNhdChcImFyZVwiKSkuY29uY2F0KFwidmVyeVwiKSkuY29uY2F0KFwiY29vbFwiKSIsCi0JCQkJKChuZXcgU3RyaW5nKCJGcm9ncyIpLmNvbmNhdCgiYXJlIikpLmNvbmNhdCgidmVyeSIpKS5jb25jYXQoImNvb2wiKQotCQkJCSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uY2F0MygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJCSIoKChuZXcgU3RyaW5nKFwiRnJvZ3NcIikuY29uY2F0KFwianVzdFwiKSkuY29uY2F0KFwicnVsZVwiKSkuY29uY2F0KFwiY29vbFwiKSkuY29uY2F0KFwia2luZ2RvbVwiKSIsCi0JCQkJKCgobmV3IFN0cmluZygiRnJvZ3MiKS5jb25jYXQoImp1c3QiKSkuY29uY2F0KCJydWxlIikpLmNvbmNhdCgiY29vbCIpKS5jb25jYXQoImtpbmdkb20iKQotCQkJCSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uY2F0NCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJCSIoKG5ldyBTdHJpbmcoXCJGcm9nc1wiKS5jb25jYXQoXCJqdXN0XCIpKS5jb25jYXQobmV3IFN0cmluZyhcInRvdGFsbHlcIikpLmNvbmNhdChuZXcgU3RyaW5nKFwiUm9ja1wiKSkpIiwKLQkJCQkoKG5ldyBTdHJpbmcoIkZyb2dzIikuY29uY2F0KCJqdXN0IikpLmNvbmNhdChuZXcgU3RyaW5nKCJ0b3RhbGx5IikpLmNvbmNhdChuZXcgU3RyaW5nKCJSb2NrIikpKQotCQkJCSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQm9yZGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9Cb3JkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ODhiNjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9Cb3JkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJvcmRlclRlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCb3JkZXJUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEJvcmRlclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFdGNoZWRSYWlzZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcihqYXZheC5zd2luZy5ib3JkZXIuRXRjaGVkQm9yZGVyLlJBSVNFRCkiICwKLQkJCSBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcihqYXZheC5zd2luZy5ib3JkZXIuRXRjaGVkQm9yZGVyLlJBSVNFRCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJldmVsUmFpc2VkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkiamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcihqYXZheC5zd2luZy5ib3JkZXIuQmV2ZWxCb3JkZXIuUkFJU0VEKSIsCi0JCQlqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUJldmVsQm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5CZXZlbEJvcmRlci5SQUlTRUQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCkiLAotCQkJamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF0dGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZU1hdHRlQm9yZGVyKDIsIDIsIDIsIDIsIGphdmEuYXd0LkNvbG9yLmJsYWNrKSIsCi0JCQlmYWxzZSwKLQkJCWphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlTWF0dGVCb3JkZXIoMiwgMiwgMiwgMiwgamF2YS5hd3QuQ29sb3IuYmxhY2spKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29mdEJldmVsKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkibmV3IGphdmF4LnN3aW5nLmJvcmRlci5Tb2Z0QmV2ZWxCb3JkZXIoMCkiLAotCQkJZmFsc2UsCi0JCQluZXcgamF2YXguc3dpbmcuYm9yZGVyLlNvZnRCZXZlbEJvcmRlcigwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5U2l6ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJImphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMiwgMiwgMiwgMikiLAotCQkJZmFsc2UsCi0JCQlqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDIsIDIsIDIsIDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGluZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJImphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlTGluZUJvcmRlcihqYXZhLmF3dC5Db2xvci5ibGFjaywgMikiLAotCQkJZmFsc2UsCi0JCQlqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIoamF2YS5hd3QuQ29sb3IuYmxhY2ssIDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29mdEJldmVsUmFpc2VkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkibmV3IGphdmF4LnN3aW5nLmJvcmRlci5Tb2Z0QmV2ZWxCb3JkZXIoamF2YXguc3dpbmcuYm9yZGVyLkJldmVsQm9yZGVyLlJBSVNFRCkiLAotCQkJZmFsc2UsCi0JCQluZXcgamF2YXguc3dpbmcuYm9yZGVyLlNvZnRCZXZlbEJvcmRlcihqYXZheC5zd2luZy5ib3JkZXIuQmV2ZWxCb3JkZXIuUkFJU0VEKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRpdGxlZEJhc2ljKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkiamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIobnVsbCxcImZyb2dcIiwyLDApIiwKLQkJCWZhbHNlLAotCQkJamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIobnVsbCwgImZyb2ciLCAyLCAwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBvdW5kQmFzaWMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJuZXcgamF2YXguc3dpbmcuYm9yZGVyLkNvbXBvdW5kQm9yZGVyKGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKSxqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCkpIiwKLQkJCWZhbHNlLAotCQkJbmV3IGphdmF4LnN3aW5nLmJvcmRlci5Db21wb3VuZEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCksamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBvdW5kTWVkaXVtKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkiamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVDb21wb3VuZEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUJldmVsQm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5CZXZlbEJvcmRlci5SQUlTRUQpLCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUJldmVsQm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5CZXZlbEJvcmRlci5MT1dFUkVEKSkiLAotCQkJZmFsc2UsCi0JCQlqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUNvbXBvdW5kQm9yZGVyKGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlQmV2ZWxCb3JkZXIoamF2YXguc3dpbmcuYm9yZGVyLkJldmVsQm9yZGVyLlJBSVNFRCksIGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlQmV2ZWxCb3JkZXIoamF2YXguc3dpbmcuYm9yZGVyLkJldmVsQm9yZGVyLkxPV0VSRUQpKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RUaXRsZWRBZHZhbmNlZCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJImphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlTGluZUJvcmRlcihqYXZhLmF3dC5TeXN0ZW1Db2xvci5hY3RpdmVDYXB0aW9uLDMwKSwgXCJIZWxsb1wiLCBqYXZheC5zd2luZy5ib3JkZXIuVGl0bGVkQm9yZGVyLkNFTlRFUiwgamF2YXguc3dpbmcuYm9yZGVyLlRpdGxlZEJvcmRlci5ERUZBVUxUX1BPU0lUSU9OLCBuZXcgamF2YS5hd3QuRm9udChcIkRpYWxvZ1wiLCBqYXZhLmF3dC5Gb250LkJPTEQsIDE4KSwgamF2YS5hd3QuQ29sb3IubGlnaHRHcmF5KSIsCi0JCQlmYWxzZSwKLQkJCWphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlTGluZUJvcmRlcihqYXZhLmF3dC5TeXN0ZW1Db2xvci5hY3RpdmVDYXB0aW9uLDMwKSwgIkhlbGxvIiwgamF2YXguc3dpbmcuYm9yZGVyLlRpdGxlZEJvcmRlci5DRU5URVIsIGphdmF4LnN3aW5nLmJvcmRlci5UaXRsZWRCb3JkZXIuREVGQVVMVF9QT1NJVElPTiwgbmV3IGphdmEuYXd0LkZvbnQoIkRpYWxvZyIsIGphdmEuYXd0LkZvbnQuQk9MRCwgMTgpLCBqYXZhLmF3dC5Db2xvci5saWdodEdyYXkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0Nhc3RUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0Nhc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTgyZGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9DYXN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IENhc3RUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENhc3RUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENhc3RUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIENhc3RUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRUb0Zsb2F0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBGbG9hdCgoZmxvYXQpMTApIiwgbmV3IEZsb2F0KDEwKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50VG9GbG9hdFNwYWNlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBGbG9hdCggKGZsb2F0KSAxMCApIiwgbmV3IEZsb2F0KDEwKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RmxvYXRUb0Zsb2F0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBGbG9hdCgoZmxvYXQpMTAuMykiLCBuZXcgRmxvYXQoKGZsb2F0KSAxMC4zKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RmxvYXRUb0Zsb2F0MigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgRmxvYXQoKGZsb2F0KTUuMykiLCBuZXcgRmxvYXQoKGZsb2F0KSA1LjMpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RGbG9hdFRvRmxvYXRTcGFjZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgRmxvYXQoIChmbG9hdCkgMTAuMyApIiwgbmV3IEZsb2F0KChmbG9hdCkgMTAuMykpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE51bGxUb1N0cmluZygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIoU3RyaW5nKW51bGwiLCAoU3RyaW5nKSBudWxsKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXRlcmFsVG9TdHJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKFN0cmluZylcImhpXCIiLCAiaGkiKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsVG9TdHJpbmdQYXJhbSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YXguc3dpbmcuSkxhYmVsKCAoU3RyaW5nKSBudWxsKSIsIG5ldyBqYXZheC5zd2luZy5KTGFiZWwoKFN0cmluZykgbnVsbCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEludFRvU2hvcnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKHNob3J0KTEwIiwgbmV3IFNob3J0KChzaG9ydCkgMTApKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RmxvYXRUb0Zsb2F0UHJpbSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIoZmxvYXQpMTAuMyIsIG5ldyBGbG9hdCgoZmxvYXQpMTAuMykpOwkKLQl9Ci0JCi0gICAgLy8JQ2FzdHMgc3RhdGVtZW50cyB3aXRoIHF1YWxpZmllZCBleHByZXNzaW9uIHVzZWQgdG8gZmFpbAotCXB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZWRTdHJpbmdSZXR1cm4oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKGphdmEubGFuZy5TdHJpbmcpb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0UmV2ZXJzZWQoXCJGcm9nXCIpIixvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXRSZXZlcnNlZCgiRnJvZyIpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdSZXR1cm4oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKFN0cmluZylvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXRSZXZlcnNlZChcIkZyb2dcIikiLG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldFJldmVyc2VkKCJGcm9nIikpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFF1YWxpZmllZENvbG9yUmV0dXJuKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihqYXZhLmF3dC5Db2xvcilvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXRDb2xvcihcInJlZFwiKSIsb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0Q29sb3IoInJlZCIpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYXN0VXBDb2xvcigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgLy8JCVRlc3Qgd2hlcmUgdGhlIG1ldGhvZCBpcyB0eXBlZCB0byByZXR1cm4gQ29sb3IgYW5kIHdlIGNhc3QgdG8gdGhlIG1vcmUgZ2VuZXJhaWxpemVkIHN1YmNsYXNzIG9mIFN5c3RlbUNvbG9yCi0JCSB0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIoamF2YS5hd3QuU3lzdGVtQ29sb3Ipb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0Q29sb3IoXCJ3aW5kb3dcIikiLG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldENvbG9yKCJ3aW5kb3ciKSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQ2hhclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQ2hhclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5MmJlOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0NoYXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogQ2hhclRlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ2hhclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ2hhclRlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQ2hhclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDaGFyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIidhJyIsIG5ldyBDaGFyYWN0ZXIoJ2EnKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBDaGFyYWN0ZXIoJ2EnKSIsIG5ldyBDaGFyYWN0ZXIoJ2EnKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVvdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiJ1wiJyIsIG5ldyBDaGFyYWN0ZXIoJ1wiJykpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFNpbmdsZVF1b3RlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIidcXCcnIiwgbmV3IENoYXJhY3RlcignXCcnKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFja3NsYXNoKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIidcXFxcJyIsIG5ldyBDaGFyYWN0ZXIoJ1xcJykpOwkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RDaGFyRXhjZXB0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIidhc2RmJyIsIG51bGwsIHRydWUsIHRydWUpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0V4Y2VwdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvRXhjZXB0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzEyMzNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvRXhjZXB0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEV4Y2VwdGlvblRlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFeGNlcHRpb25UZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEV4Y2VwdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvb01hbnlQYXJhbXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEludGVnZXIoXCIzLDNcIikiLCBudWxsLCB0cnVlLCB0cnVlKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RVbnJlc29sdmVkQ2xhc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEFCQ0QoNCkiLCBudWxsLCB0cnVlLCB0cnVlKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RVbnJlc29sdmVkTWV0aG9kKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoImdldE1ldGhvZCgpIixudWxsLHRydWUsIHRydWUpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFVucmVzb2x2ZWRMaXRlcmFsKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoInVucmVzb2x2ZWRMaXRlcmFsIixudWxsLHRydWUsIHRydWUpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0luaXRQYXJzZXJTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9Jbml0UGFyc2VyU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmNGQ2Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0luaXRQYXJzZXJTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEluaXRQYXJzZXJTdWl0ZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEluaXRQYXJzZXJTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQkvLyBUZXN0IGNhc2VzIHRvIGJlIGluY2x1ZGUgaW4gdGhlIHN1aXRlCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgdGVzdHNMaXN0W10gPSB7Ci0JCU5lZWRzQ29kaW5nVGVzdC5jbGFzcywKLQkJQmxvY2tUZXN0LmNsYXNzLAotCQlBcnJheUNvbnN0cnVjdG9yVGVzdC5jbGFzcywKLQkJTXVsdGlBcmdTdGF0aWNNZXRob2RUZXN0LmNsYXNzLAotCQlNdWx0aUFyZ0NvbnN0cnVjdG9yVGVzdC5jbGFzcywKLQkJTXVsdGlBcmdJbnN0YW5jZVRlc3QuY2xhc3MsCi0JCU51bWJlclRlc3QuY2xhc3MsCi0JCUNhc3RUZXN0LmNsYXNzLAotCQlFeGNlcHRpb25UZXN0LmNsYXNzLAotCQlMaXRlcmFsVGVzdC5jbGFzcywKLQkJU3RyaW5nVGVzdC5jbGFzcywKLQkJQ2hhclRlc3QuY2xhc3MsCi0JCUpGQ1Rlc3QuY2xhc3MsCi0JCUJvcmRlclRlc3QuY2xhc3MsCi0JCU92ZXJsb2FkaW5nVGVzdC5jbGFzcywKLQkJU2FtZU5hbWU0NjM3NlRlc3QuY2xhc3MKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBrZ05hbWUgPSAib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIiIDsKLQkgICAgCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhY2thZ2VTdWl0ZS4KLQkgKi8KLQlwdWJsaWMgSW5pdFBhcnNlclN1aXRlKCkgewotCQlzdXBlcigpOwotCQlwb3B1bGF0ZVN1aXRlKCkgOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWNrYWdlU3VpdGUuCi0JICogQHBhcmFtIHRoZUNsYXNzCi0JICovCi0JcHVibGljIEluaXRQYXJzZXJTdWl0ZShDbGFzcyB0aGVDbGFzcykgewotCQlzdXBlcih0aGVDbGFzcyk7Ci0JCXBvcHVsYXRlU3VpdGUoKSA7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhY2thZ2VTdWl0ZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBJbml0UGFyc2VyU3VpdGUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXBvcHVsYXRlU3VpdGUoKSA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU3VpdGUgKCkgewotCQlmb3IgKGludCBpPTA7IGk8dGVzdHNMaXN0Lmxlbmd0aDsgaSsrKQotCQkgIGFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pIDsKLQkJCi0JCUFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlLmluaXRTdWl0ZSh0aGlzLCBuZXcgSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpKTsKLQl9Ci0gICAgCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IEluaXRQYXJzZXJTdWl0ZSgiVGVzdCBmb3I6ICIrcGtnTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0luaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0luaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzQ0N2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9Jbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIuSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLkluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyOwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIGV4dGVuZHMgQWJzdHJhY3RJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciB7Ci0KLQlwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotCQotCXB1YmxpYyBJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcigpIHsKLQkJdGhpcy5jbGFzc0xvYWRlciA9IG51bGw7CQotCX0KLQkKLQlwdWJsaWMgSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwkKLQl9Ci0JCi0JLyoqCi0JICogVGVzdEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluaXRTdHJpbmcoU3RyaW5nIGFTdHJpbmcsIE9iamVjdCBleHBlY3RlZFJlc3VsdCwgYm9vbGVhbiB0aHJvd3NFeGNlcHRpb24sIGJvb2xlYW4gZXF1YWxzT25seSkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCS8vIEVxdWFscyBvbmx5IG1lYW5zIGFjY2VwdCBpZiA9PSBvciBlcXVhbHMoKSwgZG9uJ3QgdHJ5IHRvIGdvIG9uIGFuZCBzYXkgbWF5YmUgZXF1YWwuCi0KLQkJdHJ5IHsKLQkJCUluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIHBhcnNlciA9IEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyLmNyZWF0ZVBhcnNlcihhU3RyaW5nLCBjbGFzc0xvYWRlcik7Ci0JCQlPYmplY3QgcmVzdWx0ID0gcGFyc2VyLmV2YWx1YXRlKCk7Ci0JCQlpZiAodGhyb3dzRXhjZXB0aW9uKSB7Ci0JCQkJQXNzZXJ0LmZhaWwoIkl0IHNob3VsZCBvZiB0aHJvd24gYW4gZXhjZXB0aW9uLiBJbnN0ZWFkIHJlc3VsdD0iICsgKHJlc3VsdCAhPSBudWxsID8gcmVzdWx0LnRvU3RyaW5nKCkgOiAibnVsbCIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlc3VsdCA9PSBleHBlY3RlZFJlc3VsdCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfSBlbHNlIGlmICgKLQkJCQkJKHJlc3VsdCA9PSBudWxsICYmIGV4cGVjdGVkUmVzdWx0ICE9IG51bGwpIHx8IChleHBlY3RlZFJlc3VsdCA9PSBudWxsICYmIHJlc3VsdCAhPSBudWxsKSkgewotCQkJCQkJQXNzZXJ0LmZhaWwoIkV4cGVjdGVkUmVzdWx0PSIgKyBleHBlY3RlZFJlc3VsdCArICIgcmVzdWx0PSIgKyByZXN1bHQpOwotCQkJCX0gZWxzZSBpZiAocmVzdWx0LmVxdWFscyhleHBlY3RlZFJlc3VsdCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIEl0IG1heSBiZSB0aGF0IHRoZSBlcXVhbHMgZXhwcmVzc2lvbiBpcyBiYWQuICBJZiBzbyB1c2UgdGhlIHRvU3RyaW5nKCkgdG8gZG8gYSBwYXJ0aWFsIGNvbXBhcmlzb24KLQkJCQkJaWYgKHJlc3VsdC5nZXRDbGFzcygpID09IGV4cGVjdGVkUmVzdWx0LmdldENsYXNzKCkpIHsKLQkJCQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMoZXhwZWN0ZWRSZXN1bHQudG9TdHJpbmcoKSkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIFRoZSB0b1N0cmluZ3MgZG8gbm90IG1hdGNoIHBlcmZlY3RseSBidXQgdGhlIGNsYXNzZXMgZG8uCi0JCQkJCQkJLy8gVHJ5IGFuZCBzZWUgaG93IGNsb3NlIHRoZSB0d28gc3RyaW5ncyBhcmUKLQkJCQkJCQlpZiAoIGV4cGVjdGVkUmVzdWx0LmdldENsYXNzKCkuaXNBcnJheSgpICYmIHJlc3VsdC5nZXRDbGFzcygpLmlzQXJyYXkoKSl7Ci0JCQkJCQkJCUNsYXNzIGV4cGVjdGVkUmVzdWx0Q2xhc3MgPSBleHBlY3RlZFJlc3VsdC5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQkJCQkJQ2xhc3MgcmVzdWx0Q2xhc3MgPSByZXN1bHQuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJCQkJCWludCByZXN1bHRMZW5ndGggPSBBcnJheS5nZXRMZW5ndGgocmVzdWx0KTsKLQkJCQkJCQkJaW50IGV4cGVjdGVkTGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGV4cGVjdGVkUmVzdWx0KTsKLQkJCQkJCQkJaWYgKCBleHBlY3RlZExlbmd0aCA9PSByZXN1bHRMZW5ndGggKXsKLQkJCQkJCQkJCWlmICggcmVzdWx0Q2xhc3MgPT0gZXhwZWN0ZWRSZXN1bHRDbGFzcyApIHsKLQkJCQkJCQkJCQkvLyBUT0RPIFNob3VsZCBhY3R1YWxseSBzdGVwIGluIGFuZCBjaGVjayBlYWNoIGVsZW1lbnQgdG9vLgotCQkJCQkJCQkJCXJldHVybjsJCQkJCQkJCQkJCQkJCQkJCQkKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJQXNzZXJ0LmZhaWwoIGFTdHJpbmcKLQkJCQkJCQkJCQkJCSsgIiBFeHBlY3RlZFJlc3VsdD0iCi0JCQkJCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0Ci0JCQkJCQkJCQkJCQkrICIgQWN0dWFsUmVzdWx0PSIKLQkJCQkJCQkJCQkJCSsgcmVzdWx0Ci0JCQkJCQkJCQkJCQkrICIgRXhwZWN0ZWRDbGFzcz0iCi0JCQkJCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0LmdldENsYXNzKCkKLQkJCQkJCQkJCQkJCSsgIiBBY3R1YWxDbGFzcz0iCi0JCQkJCQkJCQkJCQkrIHJlc3VsdC5nZXRDbGFzcygpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCUFzc2VydC5mYWlsKCBhU3RyaW5nCi0JCQkJCQkJCQkJCSsgIiBFeHBlY3RlZFJlc3VsdD0iCi0JCQkJCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQKLQkJCQkJCQkJCQkJKyAiIEFjdHVhbFJlc3VsdD0iCi0JCQkJCQkJCQkJCSsgcmVzdWx0Ci0JCQkJCQkJCQkJCSsgIiBFeHBlY3RlZENsYXNzPSIKLQkJCQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdC5nZXRDbGFzcygpCi0JCQkJCQkJCQkJCSsgIiBBY3R1YWxDbGFzcz0iCi0JCQkJCQkJCQkJCSsgcmVzdWx0LmdldENsYXNzKCkpOwkJCi0JCQkJCQkJCX0JCQkJCQkJCQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChlcXVhbHNPbmx5KQotCQkJCQkJCQkJQXNzZXJ0LmZhaWwoIGFTdHJpbmcKLQkJCQkJCQkJCQkrICIgRXhwZWN0ZWRSZXN1bHQ9IgotCQkJCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQKLQkJCQkJCQkJCQkrICIgQWN0dWFsUmVzdWx0PSIKLQkJCQkJCQkJCQkrIHJlc3VsdAotCQkJCQkJCQkJCSsgIiBFeHBlY3RlZENsYXNzPSIKLQkJCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0LmdldENsYXNzKCkKLQkJCQkJCQkJCQkrICIgQWN0dWFsQ2xhc3M9IgotCQkJCQkJCQkJCSsgcmVzdWx0LmdldENsYXNzKCkpOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJQXNzZXJ0LmZhaWwoIGFTdHJpbmcKLQkJCQkJCQkJKyAiIEV4cGVjdGVkUmVzdWx0PSIKLQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdAotCQkJCQkJCQkrICIgQWN0dWFsUmVzdWx0PSIKLQkJCQkJCQkJKyByZXN1bHQKLQkJCQkJCQkJKyAiIEV4cGVjdGVkQ2xhc3M9IgotCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0LmdldENsYXNzKCkKLQkJCQkJCQkJKyAiIEFjdHVhbENsYXNzPSIKLQkJCQkJCQkJKyByZXN1bHQuZ2V0Q2xhc3MoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAodGhyb3dzRXhjZXB0aW9uKSB7Ci0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBlLmdldE9yaWdpbmFsRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvSkZDVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9KRkNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ODNhNDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9KRkNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEpGQ1Rlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSkZDVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKRkNUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEpGQ1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERpbWVuc2lvbigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5hd3QuRGltZW5zaW9uKDEsMSkiLCBuZXcgamF2YS5hd3QuRGltZW5zaW9uKDEsIDEpKTsJCi0gICAgfQotCXB1YmxpYyB2b2lkIHRlc3REaW1lbnNpb25OZWcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEuYXd0LkRpbWVuc2lvbigtMSwtMSkiLCBuZXcgamF2YS5hd3QuRGltZW5zaW9uKC0xLCAtMSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdENvbG9yQ29uc3RhbnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiamF2YS5hd3QuQ29sb3IuY3lhbiIsIGphdmEuYXd0LkNvbG9yLmN5YW4pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdENvbG9yU3RyaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoImphdmEuYXd0LkNvbG9yLmN5YW4udG9TdHJpbmcoKSIsIGphdmEuYXd0LkNvbG9yLmN5YW4udG9TdHJpbmcoKSk7ICAgIAkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdENvbG9yUkdCKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmF3dC5Db2xvcigxMCwyMCwzMCkiLCBuZXcgamF2YS5hd3QuQ29sb3IoMTAsIDIwLCAzMCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEludGVnZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEludGVnZXIoNTApIiwgbmV3IEludGVnZXIoNTApKTsgICAgCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlck5lZ2F0aXZlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmxhbmcuSW50ZWdlcigtNTApIiwgbmV3IEludGVnZXIoLTUwKSk7ICAgIAkKLQl9CQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgU2hvcnQoKHNob3J0KTUwKSIsIG5ldyBTaG9ydCgoc2hvcnQpNTApKTsgICAgCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnROZWdhdGl2ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgU2hvcnQoKHNob3J0KS01MCkiLCBuZXcgU2hvcnQoKHNob3J0KS01MCkpOyAgICAJCi0JfQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9uZygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgTG9uZyg1MEwpIiwgbmV3IExvbmcoNTBMKSk7ICAgIAkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdExvbmdOZWdhdGl2ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5sYW5nLkxvbmcoLTUwTCkiLCBuZXcgTG9uZygtNTBMKSk7ICAgIAkKLQl9CQotCXB1YmxpYyB2b2lkIHRlc3RCeXRlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBCeXRlKChieXRlKTEwKSIsIG5ldyBCeXRlKChieXRlKTEwKSk7ICAgIAkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEJ5dGVOZWdhdGl2ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgQnl0ZSgoYnl0ZSktMTApIiwgbmV3IEJ5dGUoKGJ5dGUpLTEwKSk7ICAgIAkKLQl9CQotCXB1YmxpYyB2b2lkIHRlc3RGbG9hdCgpIHRocm93cyBUaHJvd2FibGUgewotLy8JCVRPRE8gTmVlZCB0byBmaXggdGhpcwotLy8JCQlJdCBqdXN0IGRvZXNuJ3Qgd29yayB3L28gamF2YS5sYW5nIG9uIGZyb250LiBUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCBDb250cnVjdG9yIGdvaW5nIGNsb3NlZCB0b28gZWFybHkgYmVjYXVzZSBvZiB0aGUnLicgaW4gMy41LAotLy8JCQlidXQgaWYgeW91IGZpeCB0aGF0LCB0aGVuIChuZXcgU3RyaW5nKCJGcm9nIikuY29uY2F0KCJ4eXoiKSkuY29uY2F0KC4uLiBnZXRzIGFsbCBtZXNzZWQgdXAgYmVjYXVzZSBpdAotLy8JCQl0cmllcyB0byBwcm9jZXNzIFN0cmluZygpLmNvbmNhdCgpIHRvZ2V0aGVyLCBhbmQgaG93IHRoYXQgc2hvdWxkIHdvcmsgZG9lc24ndCB3b3JrIHRoZSB3YXkgaXQgZG9lcy4gCQkKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEubGFuZy5GbG9hdCgxMC4zRikiLCBuZXcgRmxvYXQoMTAuM0YpKTsgICAgCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0vLwkJVE9ETyBzYW1lIHByb2JsZW0gYXMgdGVzdEZsb2F0LiBOZWVkIGphdmEubGFuZyBmb3Igbm93LgkJCi0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmxhbmcuRG91YmxlKDEwLjNEKSIsIG5ldyBEb3VibGUoMTAuM0QpKTsgICAgCQotCX0JCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJTdHJpbmcoKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uLCBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgSW50ZWdlcihcIjUwXCIpIiwgbmV3IEludGVnZXIoIjUwIikpOyAgICAJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RGbG93TGF5b3V0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmF3dC5GbG93TGF5b3V0KCkiLCBuZXcgamF2YS5hd3QuRmxvd0xheW91dCgpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbWFnZUljb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmF4LnN3aW5nLkltYWdlSWNvbiggXCJDOi9XSU5OVC9aYXBvdGVjLmJtcFwiKSIsbmV3IGphdmF4LnN3aW5nLkltYWdlSWNvbiggIkM6L1dJTk5UL1phcG90ZWMuYm1wIiApKTsgIAkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFJlY3RhbmdsZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJCSJuZXcgamF2YS5hd3QuUmVjdGFuZ2xlKCAxMCAsIDIwICwgMzAgLCA0MCApIiwKLQkJCQluZXcgamF2YS5hd3QuUmVjdGFuZ2xlKDEwLCAyMCwgMzAsIDQwKSk7Ci0gICAgCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLnV0aWwuTG9jYWxlKFwiZnJcIixcIkZSXCIpIiwgbmV3IGphdmEudXRpbC5Mb2NhbGUoImZyIiwgIkZSIikpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdExvY2FsZVZhcmlhbnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEudXRpbC5Mb2NhbGUoXCJmclwiLFwiRlJcIixcIlwiKSIsIG5ldyBqYXZhLnV0aWwuTG9jYWxlKCJmciIsICJGUiIsICIiKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxlRXhjZXB0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgLy9Mb2NhbGUgY29uc3RydWN0b3IgY2Fubm90IHRha2UgbnVsbCBhcyBhcmd1bWVudCBsaWtlIHRoaXM6IG5ldyBKYXZhLnV0aWwuTG9jYWxlKCJmciIsICJGUiIsIG51bGwpCi0JCSAgLy9zbyB0aGlzIGlzIGV4cGVjdGVkIHRvIGZhaWwKLQkJICB0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS51dGlsLkxvY2FsZShcImZyXCIsXCJGUlwiLG51bGwpIiwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmF3dC5EaWFsb2cobmV3IGphdmEuYXd0LkZyYW1lKCkpIiwgZmFsc2UsIG5ldyBqYXZhLmF3dC5EaWFsb2cobmV3IGphdmEuYXd0LkZyYW1lKCkpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RMZW5ndGgoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEludGVnZXIoIDUwICkudG9TdHJpbmcoKS5sZW5ndGgoKSIsIG5ldyBJbnRlZ2VyKG5ldyBJbnRlZ2VyKCA1MCApLnRvU3RyaW5nKCkubGVuZ3RoKCkpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCkuc2l6ZSgpIiwgbmV3IEludGVnZXIobmV3IGphdmEudXRpbC5BcnJheUxpc3QoKS5zaXplKCkpKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3Vyc29yKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmF3dC5DdXJzb3IoamF2YS5hd3QuQ3Vyc29yLkhBTkRfQ1VSU09SKSIsbmV3IGphdmEuYXd0LkN1cnNvcihqYXZhLmF3dC5DdXJzb3IuSEFORF9DVVJTT1IpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RQYW5lbCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5hd3QuUGFuZWwobnVsbCkiLCBmYWxzZSwgbmV3IGphdmEuYXd0LlBhbmVsKG51bGwpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb21wbGV4Rm9udCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJIm5ldyBqYXZhLmF3dC5Gb250KFwiRGlhbG9nXCIsIGphdmEuYXd0LkZvbnQuQk9MRCB8IGphdmEuYXd0LkZvbnQuSVRBTElDLCAxMikiLAotCQkJbmV3IGphdmEuYXd0LkZvbnQoIkRpYWxvZyIsIGphdmEuYXd0LkZvbnQuQk9MRCB8IGphdmEuYXd0LkZvbnQuSVRBTElDLCAxMikpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RLZXlTdHJva2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJqYXZheC5zd2luZy5LZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKGphdmEuYXd0LmV2ZW50LktleUV2ZW50LlZLX0gsIGphdmEuYXd0LkV2ZW50LkFMVF9NQVNLIHwgamF2YS5hd3QuRXZlbnQuQ1RSTF9NQVNLIHwgamF2YS5hd3QuRXZlbnQuU0hJRlRfTUFTSywgdHJ1ZSkiLAotCQkJamF2YXguc3dpbmcuS2V5U3Ryb2tlLmdldEtleVN0cm9rZShqYXZhLmF3dC5ldmVudC5LZXlFdmVudC5WS19ILCBqYXZhLmF3dC5FdmVudC5BTFRfTUFTSyB8IGphdmEuYXd0LkV2ZW50LkNUUkxfTUFTSyB8IGphdmEuYXd0LkV2ZW50LlNISUZUX01BU0ssIHRydWUpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0xpdGVyYWxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0xpdGVyYWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOGE3MzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9MaXRlcmFsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IExpdGVyYWxUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIExpdGVyYWxUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExpdGVyYWxUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIExpdGVyYWxUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIlwiRnJvZ1wiIiwgIkZyb2ciKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm51bGwiLCBudWxsKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RGYWxzZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJmYWxzZSIsIEJvb2xlYW4uRkFMU0UpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFRydWUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygidHJ1ZSIsIEJvb2xlYW4uVFJVRSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhblRydWUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiQm9vbGVhbi5UUlVFIiwgQm9vbGVhbi5UUlVFKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9NdWx0aUFyZ0NvbnN0cnVjdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9NdWx0aUFyZ0NvbnN0cnVjdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTU3ZmZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTXVsdGlBcmdDb25zdHJ1Y3RvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBNdWx0aUFyZ0NvbnN0cnVjdG9yVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUFyZ0NvbnN0cnVjdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNdWx0aUFyZ0NvbnN0cnVjdG9yVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBNdWx0aUFyZ0NvbnN0cnVjdG9yVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvQm9vbGVhbnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKGZhbHNlLCBmYWxzZSkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhmYWxzZSxmYWxzZSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b0ludHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDEyLCAyNCkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygxMiwyNCkpOwkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlZUZsb2F0cygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKGZsb2F0KTEyLChmbG9hdCkyNCwoZmxvYXQpNTApIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMTIsMjQsNTApKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvRG91YmxlcygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMTIuNWQsIDI0LjVkKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDEyLjVkLDI0LjVkKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvU3RyaW5ncygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoXCJhXCIsIFwiYlwiKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCJhIiwiYiIpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29Db2xvcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKGphdmEuYXd0LkNvbG9yLnJlZCwgamF2YS5hd3QuQ29sb3IucmVkKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKGphdmEuYXd0LkNvbG9yLnJlZCxqYXZhLmF3dC5Db2xvci5yZWQpKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvTmV3Q29sb3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgamF2YS5hd3QuQ29sb3IoMjU1LDAsMCksIG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsMCwwKSkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgamF2YS5hd3QuQ29sb3IoMjU1LDAsMCksbmV3IGphdmEuYXd0LkNvbG9yKDI1NSwwLDApKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TG90cygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoXCJwcm9jZXNzb3JcIiwgMCwgXCJjdXN0b21lclNlYXJjaENsaWVudE9wXCIsIDAsIFwiMjM0MzQzNFwiLCBcIjM0NDMyMzQyMzRcIiwgXCJkZXBvc2l0UmVwRm10XCIsIFwiZGVwb3NpdFJlcEZtdFwiLCBcIlwiLCBcIlwiLCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoInByb2Nlc3NvciIsIDAsICJjdXN0b21lclNlYXJjaENsaWVudE9wIiwgMCwgIjIzNDM0MzQiLCAiMzQ0MzIzNDIzNCIsICJkZXBvc2l0UmVwRm10IiwgImRlcG9zaXRSZXBGbXQiLCAiIiwgIiIsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSkpOwkKLQl9Ci0KLS8vIFRlc3RjYXNlIGZvciBCdWd6aWxsYSBidWcgIzU4ODU0IC0gbm90IHlldCBmaXhlZC4KLS8vCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWROZXN0ZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLS8vCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGphdmEubGFuZy5TdHJpbmcobmV3IFN0cmluZyhcInNcIikpLCBcImFcIikiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgamF2YS5sYW5nLlN0cmluZyhuZXcgU3RyaW5nKCJzIikpLCAiYSIpKTsJCi0vLwl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL011bHRpQXJnSW5zdGFuY2VUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL011bHRpQXJnSW5zdGFuY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMDM4NGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9NdWx0aUFyZ0luc3RhbmNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IE11bHRpQXJnSW5zdGFuY2VUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE11bHRpQXJnSW5zdGFuY2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE11bHRpQXJnSW5zdGFuY2VUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE11bHRpQXJnSW5zdGFuY2VUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHdvQm9vbGVhbnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KGZhbHNlLCBmYWxzZSkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldChmYWxzZSxmYWxzZSkpOwkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29JbnRzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldCgxMiwgMjQpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoMTIsMjQpKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VGhyZWVGbG9hdHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KChmbG9hdCkxMiwoZmxvYXQpMjQsKGZsb2F0KTUwKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KDEyLDI0LDUwKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvRG91YmxlcygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoMTIuNWQsIDI0LjVkKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KDEyLjVkLDI0LjVkKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvU3RyaW5ncygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoXCJhXCIsIFwiYlwiKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KCJhIiwiYiIpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29Db2xvcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KGphdmEuYXd0LkNvbG9yLnJlZCwgamF2YS5hd3QuQ29sb3IucmVkKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KGphdmEuYXd0LkNvbG9yLnJlZCxqYXZhLmF3dC5Db2xvci5yZWQpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29OZXdDb2xvcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsMCwwKSwgbmV3IGphdmEuYXd0LkNvbG9yKDI1NSwwLDApKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsMCwwKSxuZXcgamF2YS5hd3QuQ29sb3IoMjU1LDAsMCkpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9NdWx0aUFyZ1N0YXRpY01ldGhvZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTXVsdGlBcmdTdGF0aWNNZXRob2RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDJmOTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9NdWx0aUFyZ1N0YXRpY01ldGhvZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBNdWx0aUFyZ1N0YXRpY01ldGhvZFRlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlBcmdTdGF0aWNNZXRob2RUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE11bHRpQXJnU3RhdGljTWV0aG9kVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBNdWx0aUFyZ1N0YXRpY01ldGhvZFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR3b0Jvb2xlYW5zKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldChmYWxzZSwgZmFsc2UpIixvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoZmFsc2UsZmFsc2UpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29JbnRzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldCgxMiwgMjQpIixvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoMTIsMjQpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlZUZsb2F0cygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoKGZsb2F0KTEyLChmbG9hdCkyNCwoZmxvYXQpNTApIixvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoMTIsMjQsNTApKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvRG91YmxlcygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoMTIuNWQsIDI0LjVkKSIsb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KDEyLjVkLDI0LjVkKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvU3RyaW5ncygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoXCJhXCIsIFwiYlwiKSIsb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KCJhIiwiYiIpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29Db2xvcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KGphdmEuYXd0LkNvbG9yLnJlZCwgamF2YS5hd3QuQ29sb3IucmVkKSIsb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KGphdmEuYXd0LkNvbG9yLnJlZCxqYXZhLmF3dC5Db2xvci5yZWQpKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvTmV3Q29sb3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldChuZXcgamF2YS5hd3QuQ29sb3IoMjU1LDAsMCksIG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsMCwwKSkiLG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldChuZXcgamF2YS5hd3QuQ29sb3IoMjU1LDAsMCksbmV3IGphdmEuYXd0LkNvbG9yKDI1NSwwLDApKSk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL05hdmlnYXRpb25QYXJhbWV0ZXJzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL05hdmlnYXRpb25QYXJhbWV0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMWU2ZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9OYXZpZ2F0aW9uUGFyYW1ldGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBOYXZpZ2F0aW9uUGFyYW1ldGVycy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEuYXd0Lio7Ci0KLS8qKgotICogVGVzdCBjbGFzcyBmb3IgdGhlIGluaXRTdHJpbWcgcGFyc2VyIC0gVGhpcyBpcyB0aGVyZSBhZnRlciB0aGUgU3BhbmlzaCBmb2xrcyBmb3VuZCBzb21lIGVycm9ycyB3aXRoIGluaXRTdHJpbmdzCi0gKiB0aGF0IHNob3dlZCB1cCBkZWZpY2llbmNpZXMgd2hlcmUgd2UgaGFkIG1ldGhvZHMgd2l0aCBtdWx0aXBsZSBhcmd1bWVudHMgYW5kIHNvbWUgb2YgdGhlIGV4cHJlc3Npb25zIGluc2lkZSB0aGUKLSAqIGFyZ3VtZW50cyB3ZXJlIG5vdCBiZWluZyBjbG9zZWQgY29ycmVjdGx5LiAgVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBoYXZlIGxvdHMgb2YgbWV0aG9kcyAoIGNvbnN0cnVjdG9ycyBhbmQgc3RhdGljcwotICogYW5kIGluc3RhbmNlIG1ldGhvZHMgKSB3aXRoIG11bHRpcGxlIGFyZ3VtZW50IHR5cGVzIHRvIHRlc3QgdGhlc2Ugc2NlbmFyaW9zLCBhbmQgbmljZSB0b1N0cmluZygpIG1ldGhvZHMgc28gdGhhdCB3ZSBjYW4KLSAqIGdldCBnb29kIGhpdCByZXN1bHRzIG9uIHRoZSB0ZXN0IHN1Y2NlZWRpbmcgYnkgYSBwZXJmZWN0IHRvU3RyaW5nKCkgbWF0Y2gKLSAqLwotcHVibGljIGNsYXNzIE5hdmlnYXRpb25QYXJhbWV0ZXJzIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTI4OTUzMDQ5MjgzMzQ4NDY0MEw7Ci0JcHJvdGVjdGVkIGludCB4ID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0JcHJvdGVjdGVkIGludCB5ID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYm9vbEEsIGJvb2xCLCBib29sQzsKLQlwcm90ZWN0ZWQgQ29sb3IgY29sb3JBLCBjb2xvckI7Ci0JcHJvdGVjdGVkIFN0cmluZyBzdHJpbmdBLCBzdHJpbmdCLCBzdHJpbmdDOwotCXByb3RlY3RlZCBkb3VibGUgZDEgPSBEb3VibGUuTUlOX1ZBTFVFOwotCXByb3RlY3RlZCBkb3VibGUgZDIgPSBEb3VibGUuTUlOX1ZBTFVFOwotCXByb3RlY3RlZCBmbG9hdCBmMSA9IEZsb2F0Lk1JTl9WQUxVRTsKLQlwcm90ZWN0ZWQgZmxvYXQgZjIgPSBGbG9hdC5NSU5fVkFMVUU7CQotCXByb3RlY3RlZCBmbG9hdCBmMyA9IEZsb2F0Lk1JTl9WQUxVRTsJCi0JcHJvdGVjdGVkIGludFtdW10gZkludEFycmF5OwkKLQlwcm90ZWN0ZWQgZG91YmxlW11bXSBmRG91YmxlRG91YmxlQXJyYXk7Ci0JcHJvdGVjdGVkIGRvdWJsZVtdIGZEb3VibGVBcnJheTsJCi0JcHJvdGVjdGVkIE1hcCBmRWxlbWVudHM7CQotCi0vLyBUaGUgb3JpZ2luYWwgY29uc3RydWN0b3Igd2UgYnJva2Ugb24gLSBsZWZ0IHRoZXJlIGZvciBwb3N0ZXJpdHkKLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhTdHJpbmcgbmV3Q29udGV4dFVzZWQsIGludCBuZXdOYXZpZ2F0aW9uLCBTdHJpbmcgbmV3T3BlcmF0aW9uTmFtZSwgaW50IG5ld0NoYWluQ29udGV4dCwgU3RyaW5nIG5ld1ZpZXdOYW1lLCBTdHJpbmcgbmV3Vmlld1NvdXJjZSwgU3RyaW5nIG5ld091dHB1dE1hcEZvcm1hdCwgU3RyaW5nIG5ld0lucHV0TWFwRm9ybWF0LCBTdHJpbmcgYSwgU3RyaW5nIGIsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBib29sZWFuIHVzZVAsIGJvb2xlYW4gdXNlUykgewotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKCl7Ci19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoaW50IHgpewotCXRoaXMueCA9IHg7Ci0JeSA9IDEwMDsKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBzZXRFbGVtQXQoT2JqZWN0IGFLZXksIGludCBhVmFsdWUpewotCWlmICggZkVsZW1lbnRzID09IG51bGwgKSB7Ci0JCWZFbGVtZW50cyA9IG5ldyBIYXNoTWFwKDEpOwotCX07Ci0JZkVsZW1lbnRzLnB1dChhS2V5LG5ldyBJbnRlZ2VyKGFWYWx1ZSkpOwotCXJldHVybiB0aGlzOwotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMsIGJvb2xlYW4gYm9vbDEsIGJvb2xlYW4gYm9vbDIsIGJvb2xlYW4gYm9vbDMsIGludCB4KXsKLQlzdHJpbmdBID0gc3RyaW5nMTsKLQlzdHJpbmdCID0gc3RyaW5nMjsKLQlzdHJpbmdDID0gc3RyaW5nMzsKLQlib29sQSA9IGJvb2wxOwotCWJvb2xCID0gYm9vbDI7Ci0JYm9vbEMgPSBib29sMzsJCi0JdGhpcy54ID0geDsKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhpbnRbXVtdIGludEFycmF5KXsKLQlmSW50QXJyYXkgPSBpbnRBcnJheTsKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhkb3VibGVbXSBkb3VibGVBcnJheSl7Ci0JZkRvdWJsZUFycmF5ID0gZG91YmxlQXJyYXk7Ci19Ci0vLyBDb25zdHJ1Y3RvcnMgd2l0aCBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIGFyZ3VtZW50cwotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKGJvb2xlYW4gYSwgYm9vbGVhbiBiKXsKLQlib29sQSA9IGE7Ci0JYm9vbEIgPSBiOwotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKGludCB4LCBpbnQgeSl7Ci0JdGhpcy54ID0geDsKLQl0aGlzLnkgPSB5OwotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKGZsb2F0IGYxLCBmbG9hdCBmMiwgZmxvYXQgZjMpewotCXRoaXMuZjEgPSBmMTsKLQl0aGlzLmYyID0gZjI7Ci0JdGhpcy5mMyA9IGYzOwkKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhkb3VibGVbXVtdIGFEb3VibGVEb3VibGVBcnJheSl7Ci0JZkRvdWJsZURvdWJsZUFycmF5ID0gYURvdWJsZURvdWJsZUFycmF5OwotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKGRvdWJsZSBkMSwgZG91YmxlIGQyKXsKLQl0aGlzLmQxID0gZDE7Ci0JdGhpcy5kMiA9IGQyOwotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKENvbG9yIGNvbG9yQSwgQ29sb3IgY29sb3JCKXsKLQl0aGlzLmNvbG9yQSA9IGNvbG9yQTsKLQl0aGlzLmNvbG9yQiA9IGNvbG9yQjsKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhTdHJpbmcgc3RyaW5nQSwgU3RyaW5nIHN0cmluZ0IpewotCXRoaXMuc3RyaW5nQSA9IHN0cmluZ0E7Ci0JdGhpcy5zdHJpbmdCID0gc3RyaW5nQjsKLX0KLS8vIFN0YXRpYyBtZXRob2QgY2FsbHMgd2l0aCBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIGFyZ3VtZW50cwotcHVibGljIHN0YXRpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBnZXQoYm9vbGVhbiBhLCBib29sZWFuIGIpewotCXJldHVybiBuZXcgTmF2aWdhdGlvblBhcmFtZXRlcnMoYSxiKTsKLX0KLXB1YmxpYyBzdGF0aWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgZ2V0KGludCB4LCBpbnQgeSl7Ci0JcmV0dXJuIG5ldyBOYXZpZ2F0aW9uUGFyYW1ldGVycyh4LHkpOwotfQotcHVibGljIHN0YXRpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBnZXQoZmxvYXQgZjEsIGZsb2F0IGYyLCBmbG9hdCBmMyl7Ci0JcmV0dXJuIG5ldyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhmMSxmMixmMyk7Ci19Ci1wdWJsaWMgc3RhdGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIGdldChkb3VibGUgZDEsIGRvdWJsZSBkMil7Ci0JcmV0dXJuIG5ldyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhkMSxkMik7Ci19Ci1wdWJsaWMgc3RhdGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIGdldChDb2xvciBjb2xvckEsIENvbG9yIGNvbG9yQil7Ci0JcmV0dXJuIG5ldyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhjb2xvckEsY29sb3JCKTsKLX0KLXB1YmxpYyBzdGF0aWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgZ2V0KFN0cmluZyBzdHJpbmdBLCBTdHJpbmcgc3RyaW5nQil7Ci0JcmV0dXJuIG5ldyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhzdHJpbmdBLHN0cmluZ0IpOwotfQotcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UmV2ZXJzZWQoU3RyaW5nIGFyZyl7Ci0JLy8gUmV0dXJuIHRoZSBhcmd1bWVudCByZXZlcnNlZAotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGFyZy5sZW5ndGgoKSk7Ci0JZm9yIChpbnQgaSA9IGFyZy5sZW5ndGgoKS0xOyBpID49IDA7IGktLSkgewotCQlidWZmZXIuYXBwZW5kKGFyZy5jaGFyQXQoaSkpOwotCX0KLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci1wdWJsaWMgc3RhdGljIENvbG9yIGdldENvbG9yKFN0cmluZyBjb2xvck5hbWUpewotCS8vIFJldHVybiB0aGUgY29sb3JOYW1lIHRvIHRlc3QgY2FzdCBzdGF0ZW1lbnRzCi0JdHJ5IHsKLQkJRmllbGQgZmllbGQgPSBDb2xvci5jbGFzcy5nZXRGaWVsZChjb2xvck5hbWUpOwotCQlyZXR1cm4gKENvbG9yKSBmaWVsZC5nZXQoQ29sb3IuY2xhc3MpOwotCX0gY2F0Y2ggKCBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleGMgKSB7Ci0JCXRyeSB7Ci0JCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBmaWVsZCBpcyBvbiBTeXN0ZW1Db2xvciBhbmQgbm90IGNvbG9yCi0JCQlGaWVsZCBmaWVsZCA9IFN5c3RlbUNvbG9yLmNsYXNzLmdldEZpZWxkKGNvbG9yTmFtZSk7Ci0JCQlyZXR1cm4gKENvbG9yKSBmaWVsZC5nZXQoQ29sb3IuY2xhc3MpOwkJCi0JCX0gY2F0Y2ggKCBFeGNlcHRpb24gZSApIHsKLQkJfQotCX0gY2F0Y2ggKCBFeGNlcHRpb24gZXhjICkgewotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8vIEluc3RhbmNlIG1ldGhvZCBjYWxscyB3aXRoIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YgYXJndW1lbnRzCi1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgc2V0KGJvb2xlYW4gYSwgYm9vbGVhbiBiKXsKLQlib29sQSA9IGE7Ci0JYm9vbEIgPSBiOwotCXJldHVybiB0aGlzOwkKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBzZXQoaW50IHgsIGludCB5KXsKLQl0aGlzLnggPSB4OwotCXRoaXMueSA9IHk7Ci0JcmV0dXJuIHRoaXM7CQotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIHNldChmbG9hdCBmMSwgZmxvYXQgZjIsIGZsb2F0IGYzKXsKLQl0aGlzLmYxID0gZjE7Ci0JdGhpcy5mMiA9IGYyOwotCXRoaXMuZjMgPSBmMzsKLQlyZXR1cm4gdGhpczsJCi19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgc2V0KGRvdWJsZSBkMSwgZG91YmxlIGQyKXsKLQl0aGlzLmQxID0gZDE7Ci0JdGhpcy5kMiA9IGQyOwotCXJldHVybiB0aGlzOwkKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBzZXQoQ29sb3IgY29sb3JBLCBDb2xvciBjb2xvckIpewotCXRoaXMuY29sb3JBID0gY29sb3JBOwotCXRoaXMuY29sb3JCID0gY29sb3JCOwotCXJldHVybiB0aGlzOwotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIHNldChTdHJpbmcgc3RyaW5nQSwgU3RyaW5nIHN0cmluZ0IpewotCXRoaXMuc3RyaW5nQSA9IHN0cmluZ0E7Ci0JdGhpcy5zdHJpbmdCID0gc3RyaW5nQjsKLQlyZXR1cm4gdGhpczsJCi19Ci0vLyBUbyBzdHJpbmcgbWV0aG9kIHRvIGhlbHAgdGhlIHRlc3RzIGJlIE9LPyB3aXRoIG1hdGNoaW5nIHRvU3RyaW5nKCkgcmVzdWx0cwotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0Jd3JpdGVyLndyaXRlKCJOYXZpZ2F0aW9uUGFyYW1ldGVycygiKTsKLQlpZiAoIHggIT0gSW50ZWdlci5NSU5fVkFMVUUgKSB3cml0ZXIud3JpdGUobmV3IEludGVnZXIoeCkudG9TdHJpbmcoKSk7Ci0JaWYgKCB5ICE9IEludGVnZXIuTUlOX1ZBTFVFICkgd3JpdGVyLndyaXRlKG5ldyBJbnRlZ2VyKHkpLnRvU3RyaW5nKCkpOwkKLQl3cml0ZXIud3JpdGUoImJvb2xBPSIgKyBib29sQSk7Ci0Jd3JpdGVyLndyaXRlKCJib29sQT0iICsgYm9vbEIpOwkKLQl3cml0ZXIud3JpdGUoImJvb2xBPSIgKyBib29sQSk7Ci0Jd3JpdGVyLndyaXRlKCJib29sQz0iICsgYm9vbEMpOwkJCi0JaWYgKCBjb2xvckEgIT0gbnVsbCApIHdyaXRlci53cml0ZSgiY29sb3JBPSIgKyBjb2xvckEpOwotCWlmICggY29sb3JCICE9IG51bGwgKSB3cml0ZXIud3JpdGUoImNvbG9yQj0iICsgY29sb3JCKTsJCi0JaWYgKCBzdHJpbmdBICE9IG51bGwgKSB3cml0ZXIud3JpdGUoInN0cmluZ0E9IiArIHN0cmluZ0EpOwotCWlmICggc3RyaW5nQiAhPSBudWxsICkgd3JpdGVyLndyaXRlKCJzdHJpbmdCPSIgKyBzdHJpbmdCKTsJCQotCWlmICggc3RyaW5nQyAhPSBudWxsICkgd3JpdGVyLndyaXRlKCJzdHJpbmdCPSIgKyBzdHJpbmdDKTsKLQlpZiAoIGQxICE9IERvdWJsZS5NSU5fVkFMVUUgKSB3cml0ZXIud3JpdGUoImQxPSIgKyBkMSk7Ci0JaWYgKCBkMiAhPSBEb3VibGUuTUlOX1ZBTFVFICkgd3JpdGVyLndyaXRlKCJkMT0iICsgZDIpOwotCWlmICggZjEgIT0gRmxvYXQuTUlOX1ZBTFVFICkgd3JpdGVyLndyaXRlKCJmMT0iICsgZjEpOwotCWlmICggZjIgIT0gRmxvYXQuTUlOX1ZBTFVFICkgd3JpdGVyLndyaXRlKCJmMj0iICsgZjIpOwotCWlmICggZjIgIT0gRmxvYXQuTUlOX1ZBTFVFICkgd3JpdGVyLndyaXRlKCJmMz0iICsgZjMpOwkKLQlpZiAoIGZJbnRBcnJheSAhPSBudWxsICkgewotCQl3cml0ZXIud3JpdGUoImludCBhcnJheT0iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmSW50QXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCXdyaXRlci53cml0ZSgiWyIpOwotCQkJLy8gVGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheSBhcmUgdGhlbXNlbHZlcyBhcnJheXMgLSBpdCBpcyB0d28gZGltZW5zaW9uYWwKLQkJCWludFtdIGVsZW1lbnRzID0gZkludEFycmF5W2ldOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCXdyaXRlci53cml0ZShuZXcgSW50ZWdlcihlbGVtZW50c1tqXSkudG9TdHJpbmcoKSk7CQotCQkJfQotCQkJd3JpdGVyLndyaXRlKCJdIik7Ci0JCX0KLQl9Ci0JaWYgKCBmRG91YmxlRG91YmxlQXJyYXkgIT0gbnVsbCApIHsKLQkJd3JpdGVyLndyaXRlKCJkb3VibGVkb3VibGUgYXJyYXk9Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkRvdWJsZURvdWJsZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQl3cml0ZXIud3JpdGUoIlsiKTsKLQkJCS8vIFRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkgYXJlIHRoZW1zZWx2ZXMgYXJyYXlzIC0gaXQgaXMgdHdvIGRpbWVuc2lvbmFsCi0JCQlkb3VibGVbXSBlbGVtZW50cyA9IGZEb3VibGVEb3VibGVBcnJheVtpXTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQl3cml0ZXIud3JpdGUobmV3IERvdWJsZShlbGVtZW50c1tqXSkudG9TdHJpbmcoKSk7CQotCQkJfQotCQkJd3JpdGVyLndyaXRlKCJdIik7Ci0JCX0KLQl9Ci0JCi0JaWYgKCBmRG91YmxlQXJyYXkgIT0gbnVsbCApIHsJCi0JCXdyaXRlci53cml0ZSgiZG91YmxlIGFycmF5PSIpOwkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkRvdWJsZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQl3cml0ZXIud3JpdGUoIigiKTsJCQkKLQkJCXdyaXRlci53cml0ZShuZXcgRG91YmxlKGZEb3VibGVBcnJheVtpXSkudG9TdHJpbmcoKSk7Ci0JCQl3cml0ZXIud3JpdGUoIikiKTsJCQkKLQkJfQotCX0KLQl3cml0ZXIud3JpdGUoIikiKTsKLQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTmVlZHNDb2RpbmdUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL05lZWRzQ29kaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmVjNDUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTmVlZHNDb2RpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogTmVlZHNDb2RpbmdUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE5lZWRzQ29kaW5nVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBOZWVkc0NvZGluZ1Rlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgTmVlZHNDb2RpbmdUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0JCi0JCi0JLy8gVE9ETzogZW5hYmxlIHRoaXMgdGVzdCB3aGVuIG1hdGggd29ya3MKLQkvKgotCXB1YmxpYyB2b2lkIHRlc3RNYXRoKCkgewotCQkvLyBEb2luZyBtYXRoIGlzIG5vdCBjb2RlZCB5ZXQuICBXZSBkb24ndCBleHBlY3QgdG8gZW5jb3VudGVyIGFueSBzdHJpbmdzIGxpa2UgdGhpcyBhcyBwYXJ0IG9mIEdBCi0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjEwICsgMjAiLCBuZXcgSW50ZWdlcigxMCArIDIwKSk7CQotCX0KLQkqLwotCQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lckNsYXNzZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgIC8vCUlubmVyIGNsYXNzZXMgbmVlZCBjb2RpbmcgYnV0IHdlIGhhdmUgYSB0ZXN0IHRvIG1ha2Ugc3VyZSB3ZSB0aHJvdyBhbiBleHBsaWNpdCBleGNlcHRpb24KLQkJIHRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZheC5zd2luZy50YWJsZS5EZWZhdWx0VGFibGVNb2RlbCgpe30iLG5ldyBqYXZheC5zd2luZy50YWJsZS5EZWZhdWx0VGFibGVNb2RlbCgpewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKiAKLQkJCSAqIEBzaW5jZSAxLjEuMAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDt9LHRydWUsIHRydWUpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFBhcmFtc1RocmVlRmxvYXRzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldCgoZmxvYXQpMTIsKGZsb2F0KTI0LChmbG9hdCk1MCkiLG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldCgxMiwyNCw1MCkpOwkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RUaHJlZUZsb2F0cygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKGZsb2F0KTEyLChmbG9hdCkyNCwoZmxvYXQpNTApIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMTIsMjQsNTApKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3ROZXdQYXJhbXNUaHJlZUZsb2F0cygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoKGZsb2F0KTEyLChmbG9hdCkyNCwoZmxvYXQpNTApIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoMTIsMjQsNTApKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9OdW1iZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL051bWJlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2M2I2Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL051bWJlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBOdW1iZXJUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE51bWJlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTnVtYmVyVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBOdW1iZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRQcmltKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjEwIiwgbmV3IEludGVnZXIoMTApKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydFByaW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKHNob3J0KTEwIiwgbmV3IFNob3J0KChzaG9ydCkxMCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlU2hvcnRQcmltKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihzaG9ydCktMTAiLCBuZXcgU2hvcnQoKHNob3J0KS0xMCkpOwkKLQl9CQotCXB1YmxpYyB2b2lkIHRlc3RCeXRlUHJpbSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIoYnl0ZSkxMCIsIG5ldyBCeXRlKChieXRlKTEwKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUHJpbUV4cGxpY2l0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjEwZCIsIG5ldyBEb3VibGUoMTBkKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVnYXRpdmVEb3VibGVQcmltRXhwbGljaXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiLTEwZCIsIG5ldyBEb3VibGUoLTEwZCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEZsb2F0UHJpbUV4cGxpY2l0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjEwZiIsIG5ldyBGbG9hdCgxMGYpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RMb25nUHJpbUV4cGxpY2l0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjEwbCIsIG5ldyBMb25nKDEwbCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERvdWJsZVByaW1JbXBsaWNpdCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIxMC43NSIsIG5ldyBEb3VibGUoMTAuNzUpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZURvdWJsZVByaW1JbXBsaWNpdCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCItMTAuNzUiLCBuZXcgRG91YmxlKC0xMC43NSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFNwYWNlZERvdWJsZVByaW1JbXBsaWNpdCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIgMTAuNzUgIiwgbmV3IERvdWJsZSgxMC43NSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlRG91YmxlUHJpbUV4cGxpY2l0MigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCItMTAuNzVkIiwgbmV3IERvdWJsZSgtMTAuNzVkKSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvT3ZlcmxvYWRpbmdUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL092ZXJsb2FkaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODNhZTQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvT3ZlcmxvYWRpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogT3ZlcmxvYWRpbmdUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIFRlc3QgdGhhdCBjb3JyZWN0IG92ZXJsb2FkZWQgbWV0aG9kIGlzIGNhbGxlZC4KLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE92ZXJsb2FkaW5nVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBPdmVybG9hZGluZ1Rlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgT3ZlcmxvYWRpbmdUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVybG9hZFN0cmluZygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgSW50ZWdlcihcIjNcIikiLCBuZXcgSW50ZWdlcigzKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RPdmVybG9hZFNob3J0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBJbnRlZ2VyKDUpIiwgbmV3IEludGVnZXIoNSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvU2FtZU5hbWU0NjM3NlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvU2FtZU5hbWU0NjM3NlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlNWE3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL1NhbWVOYW1lNDYzNzZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogU2FtZU5hbWU0NjM3NlRlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0gCi0vKioKLSAqIFRoaXMgaXMgdG8gdGVzdCBmb3IgZGVmZWN0IFs0NjM3Nl0uCi0gKiAKLSAqIFNhbWVOYW1lIHRlc3QuIFRoaXMgaXMgdGVzdCB3aGVyZSB5b3UgaGF2ZSB0aGlzOgotICogCUluaXRQYXJzZXJUZXN0NDYzNzYuU2FtZU5hbWVUZXN0Q2xhc3MuamF2YQotICogCUluaXRQYXJzZXJUZXN0NDYzNzYuamF2YQotICogCi0gKiBhbmQKLSAqIAotICogCW5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5TYW1lTmFtZVRlc3RDbGFzcy5SZWFsQ2xhc3MoKQotICogCi0gKiBCZWZvcmUgWzQ2Mzc2XSB0aGUgU3RhdGljIHBhcnNlciB3b3VsZCBmaW5kIFNhbWVOYW1lVGVzdENsYXNzLmphdmEgaW5zdGVhZCBvZiB0aGUgUmVhbENsYXNzIGFuZCB3b3VsZCBvZiBmYWlsZWQuCi0gKiBUbyBjb21waWxlIGluIEVjbGlwc2Ugd2UgbmVlZCB0byBoYXZlIG9uZSBvZiB0aGUgY2xhc3NlcyBiZSBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlLiBFY2xpcHNlIGNvbXBsYWlucyBpZiB3ZSBkaWRuJ3QuCi0gKiBCdXQgdGhlcmUgaXMgbm90aGluZyB0byBzdG9wIHRoaXMgZnJvbSBoYXBwZW5pbmcgd2l0aCBwYWNrYWdlcyB0b28gaWYgdGhleSBhcmUgc3ByZWFkIGFjcm9zcyBjb21waWxlIGdyb3Vwcy4gIAotICovCi1wdWJsaWMgY2xhc3MgU2FtZU5hbWU0NjM3NlRlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFNhbWVOYW1lNDYzNzZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0NDYzNzYoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGluaXRQYXJzZXJUZXN0NDYzNzYuU2FtZU5hbWVUZXN0Q2xhc3MoKSIsIG5ldyBpbml0UGFyc2VyVGVzdDQ2Mzc2LlNhbWVOYW1lVGVzdENsYXNzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvU3RyaW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9TdHJpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YjQ0NjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9TdHJpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogU3RyaW5nVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFN0cmluZ1Rlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiXCJGcm9nLzEyM1wiIiwgIkZyb2cvMTIzIik7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbnRWYWx1ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJTdHJpbmcudmFsdWVPZigxMCkiLCAiMTAiKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RQYXJlbnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiXCJGcm9nKDEyMylwcmluY2VcIiIsICJGcm9nKDEyMylwcmluY2UiKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVRdW90ZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiXCJGcm9nXFxcInByaW5jZVxcXCIxMjNcIiIsICJGcm9nXCJwcmluY2VcIjEyMyIpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEJhY2tTbGFzaGVzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIlwiRnJvZ1xcXFxwcmluY2VcXFxcMTIzXCIiLCAiRnJvZ1xccHJpbmNlXFwxMjMiKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RCYWNrU2xhc2goKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiXCJcXFxcRnJvZ1wiIiwgIlxcRnJvZyIpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0Z1bmN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIlwiRnJvZ1wiLmxlbmd0aCgpIiwgbmV3IEludGVnZXIoNCkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUQXJyYXlzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVEFycmF5c1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1ZDQ5Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUQXJyYXlzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQVNUQXJyYXlzVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRm9yRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5BcnJheUNvbnN0cnVjdG9yVGVzdDsKLSAKLS8qKgotICogVGVzdCBBcnJheXMgZm9yIEFTVC4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBU1RBcnJheXNUZXN0IGV4dGVuZHMgQXJyYXlDb25zdHJ1Y3RvclRlc3QgewotCi0JcHVibGljIEFTVEFycmF5c1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgZ2V0VHJlZVBhcnNlcigpIHsKLQkJcmV0dXJuIChBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIpIHRlc3RIZWxwZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlZmluZWRTZWNvbmREaW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImludFtdW10iLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTiwgMyk7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBpbnRbM11bXSIsIGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUFjY2VzcygpIHRocm93cyBUaHJvd2FibGUgewotCQlJRXhwcmVzc2lvbiBleHAgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgMSk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfQVJSQVksICJqYXZhLmxhbmcuSW50ZWdlcltdIiwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlDUkVBVElPTl9ESU1FTlNJT04sIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYLCAwKTsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKG5ldyBJbnRlZ2VyWzNdKVswXSIsIGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKSk7IAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TXV0bHRpQXJyYXlBY2Nlc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5QWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIDIpOwotCQlleHAuY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0FSUkFZLCAiaW50W11bXSIsIDApOwotCQlleHAuY3JlYXRlQXJyYXlJbml0aWFsaXplcigyKTsKLQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OLCAyKTsKLQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OLCA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfSU5ERVgsIDApOwkJCi0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihuZXcgaW50W11bXSB7ezJ9LCB7NH19KVswXVswXSIsIGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKSk7IAotCX0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNURmllbGRBY2Nlc3NUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNURmllbGRBY2Nlc3NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NGVhZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVEZpZWxkQWNjZXNzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQVNURmllbGRBY2Nlc3NUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5Gb3JFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLkFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlOwotIAotLyoqCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgQVNURmllbGRBY2Nlc3NUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ3JlYXRlIHdpdGggbmFtZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBBU1RGaWVsZEFjY2Vzc1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgZ2V0VHJlZVBhcnNlcigpIHsKLQkJcmV0dXJuIChBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIpIHRlc3RIZWxwZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROb25RdWFsaWZpZWRGaWVsZEFjY2VzcygpIHRocm93cyBUaHJvd2FibGUgewotCQlnZXRUcmVlUGFyc2VyKCkudGVzdEluaXRTdHJpbmcoIkNvbG9yLnJlZCIsIG5ldyBTdHJpbmdbXSB7ImphdmEuYXd0LioifSwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Db2xvciIpLm5ld0luc3RhbmNlKCJqYXZhLmF3dC5Db2xvci5yZWQiKSApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhwcmVzc2lvbkZpZWxkQWNjZXNzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWdldFRyZWVQYXJzZXIoKS50ZXN0SW5pdFN0cmluZygiKENvbG9yLnJlZCkucmVkIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5hd3QuKiJ9LCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LkNvbG9yIikubmV3SW5zdGFuY2UoImphdmEuYXd0LkNvbG9yLnJlZCIpICk7CS8vIFNob3VsZCBub3QgdXNlIHRoaXMgZm9ybSwgYnV0IGl0IGlzIHZhbGlkLCB1c2UgdmFsaWQgZm9ybSBmb3IgZXhwZWN0ZWQgcmVzdWx0cyBzbyBubyB3YXJuaW5ncy4KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZEZpZWxkQWNjZXNzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWdldFRyZWVQYXJzZXIoKS50ZXN0SW5pdFN0cmluZygiQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEuYWNvbG9yLnJlZCIsIG5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEifSwgIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuQ29sb3IiKS5uZXdJbnN0YW5jZSgiamF2YS5hd3QuQ29sb3IucmVkIikpOwkvLyBTaG91bGQgbm90IHVzZSB0aGlzIGZvcm0sIGJ1dCBpdCBpcyB2YWxpZCwgdXNlIHZhbGlkIGZvcm0gZm9yIGV4cGVjdGVkIHJlc3VsdHMgc28gbm8gd2FybmluZ3MuCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZEZpZWxkRXhwcmVzc2lvbkFjY2VzcygpIHRocm93cyBUaHJvd2FibGUgewotCQlnZXRUcmVlUGFyc2VyKCkudGVzdEluaXRTdHJpbmcoIm5ldyBBU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YSgpLmFjb2xvci5yZWQiLCBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLkFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhIn0sICBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LkNvbG9yIikubmV3SW5zdGFuY2UoImphdmEuYXd0LkNvbG9yLnJlZCIpKTsJLy8gU2hvdWxkIG5vdCB1c2UgdGhpcyBmb3JtLCBidXQgaXQgaXMgdmFsaWQsIHVzZSB2YWxpZCBmb3JtIGZvciBleHBlY3RlZCByZXN1bHRzIHNvIG5vIHdhcm5pbmdzLgotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uc3RhdGljRmllbGRBY2Nlc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJhcmVjdCIsIHRydWUpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsICJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLkFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhIiwgMCk7Ci0JCWdldFRyZWVQYXJzZXIoKS50ZXN0SW5pdFN0cmluZygibmV3IEFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhKCkuYXJlY3QiLCBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLkFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhIn0sICBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uc3RhdGljTmVzdGVkRmllbGRBY2Nlc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJ4IiwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLkZJRUxEX1JFQ0VJVkVSLCAiYXJlY3QiLCB0cnVlKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLkZJRUxEX1JFQ0VJVkVSLCAib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5BU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YSIsIDApOwotCQlnZXRUcmVlUGFyc2VyKCkudGVzdEluaXRTdHJpbmcoIm5ldyBBU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YSgpLmFyZWN0LngiLCBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLkFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhIn0sICBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RJbm5lckNsYXNzQWNjZXNzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVElubmVyQ2xhc3NBY2Nlc3NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NTkzZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVElubmVyQ2xhc3NBY2Nlc3NUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBBU1RJbm5lckNsYXNzQWNjZXNzVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRm9yRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5BYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZTsKLSAKLS8qKgotICogVGhpcyBpcyBmb3IgdGVzdGluZyBpbm5lciBjbGFzcyBhY2Nlc3MuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEFTVElubmVyQ2xhc3NBY2Nlc3NUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggbmFtZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBBU1RJbm5lckNsYXNzQWNjZXNzVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIGdldFRyZWVQYXJzZXIoKSB7Ci0JCXJldHVybiAoQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyKSB0ZXN0SGVscGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJGaWVsZEFjY2VzcygpIHRocm93cyBUaHJvd2FibGUgewotCQlJRXhwcmVzc2lvbiBleHAgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgIkdSRUVOIiwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW5uZXJDbGFzc1Rlc3REYXRhJElubmVySW5uZXJDbGFzcyIpOwotCQlnZXRUcmVlUGFyc2VyKCkudGVzdEluaXRTdHJpbmcoIklubmVyQ2xhc3NUZXN0RGF0YS5Jbm5lcklubmVyQ2xhc3MuR1JFRU4iLCBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLioifSwgZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElubmVyRmllbGRBY2Nlc3MyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiR1JFRU4iLCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5Jbm5lckNsYXNzVGVzdERhdGEkSW5uZXJJbm5lckNsYXNzIik7Ci0JCQotCQkvLyBUZXN0IHdoZXJlIHRoZSBpbm5lciBjbGFzcyBpcyB0aGUgdG9wIGxldmVsIGxpc3RlZC4KLQkJZ2V0VHJlZVBhcnNlcigpLnRlc3RJbml0U3RyaW5nKCJJbm5lcklubmVyQ2xhc3MuR1JFRU4iLCBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLklubmVyQ2xhc3NUZXN0RGF0YS5Jbm5lcklubmVyQ2xhc3MifSwgZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lcklubmVyRmllbGRBY2Nlc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJSRUQiLCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5Jbm5lckNsYXNzVGVzdERhdGEkSW5uZXJJbm5lckNsYXNzJElubmVySW5uZXJJbm5lckNsYXNzIik7Ci0JCQotCQlnZXRUcmVlUGFyc2VyKCkudGVzdEluaXRTdHJpbmcoIklubmVyQ2xhc3NUZXN0RGF0YS5Jbm5lcklubmVyQ2xhc3MuSW5uZXJJbm5lcklubmVyQ2xhc3MuUkVEIiwgbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS4qIn0sIGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyQ2xhc3NDcmVhdGlvbigpIHRocm93cyBUaHJvd2FibGUgewotCQlJRXhwcmVzc2lvbiBleHAgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLklubmVyQ2xhc3NUZXN0RGF0YSRJbm5lcklubmVyQ2xhc3MiLCAwKTsKLQkJLy8gQ3JlYXRlIHN0YXRpYyBpbm5lciBjbGFzcwotCQlnZXRUcmVlUGFyc2VyKCkudGVzdEluaXRTdHJpbmcoIm5ldyBJbm5lckNsYXNzVGVzdERhdGEuSW5uZXJJbm5lckNsYXNzKCkiLCBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLioifSwgZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUTWlzY1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RNaXNjVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDJhYmZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RNaXNjVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQVNUTWlzY1Rlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5BYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZTsKLSAKLS8qKgotICogU29tZSBtaXNjLiB0ZXN0cy4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgQVNUTWlzY1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBuYW1lLgotCSAqIEBwYXJhbSBuYW1lCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEFTVE1pc2NUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhckxpdGVyYWwoKSB7Ci0JCVBUQ2hhcmFjdGVyTGl0ZXJhbCBjbCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKTsKLQkJY2wuc2V0RXNjYXBlZFZhbHVlKCJcJ2FcJyIpOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBjbC5nZXRDaGFyVmFsdWUoKSk7Ci0JCWNsLnNldENoYXJWYWx1ZSgnYicpOwotCQlhc3NlcnRFcXVhbHMoIlwnYlwnIiwgY2wuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQljbC5zZXRFc2NhcGVkVmFsdWUoIlwnXFxuXCciKTsKLQkJYXNzZXJ0RXF1YWxzKCdcbicsIGNsLmdldENoYXJWYWx1ZSgpKTsKLQkJY2wuc2V0Q2hhclZhbHVlKCdcYicpOwotCQlhc3NlcnRFcXVhbHMoIlwnXFxiXCciLCBjbC5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JCWNsLnNldEVzY2FwZWRWYWx1ZSgiXCdcXHUwMzAwXCciKTsKLQkJYXNzZXJ0RXF1YWxzKCdcdTAzMDAnLCBjbC5nZXRDaGFyVmFsdWUoKSk7Ci0JCWNsLnNldENoYXJWYWx1ZSgnXHUwNDAwJyk7Ci0JCWFzc2VydEVxdWFscygiXCdcXHUwNDAwXCciLCBjbC5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpdGVyYWwoKSB7Ci0JCVBUU3RyaW5nTGl0ZXJhbCBzbCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVFN0cmluZ0xpdGVyYWwoKTsKLQkJc2wuc2V0RXNjYXBlZFZhbHVlKCJcImFcIiIpOwotCQlhc3NlcnRFcXVhbHMoImEiLCBzbC5nZXRMaXRlcmFsVmFsdWUoKSk7Ci0JCXNsLnNldExpdGVyYWxWYWx1ZSgiXGIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJcIlxcYlwiIiwgc2wuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQlzbC5zZXRFc2NhcGVkVmFsdWUoIlwiXFxuXCIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJcbiIsIHNsLmdldExpdGVyYWxWYWx1ZSgpKTsKLQkJc2wuc2V0TGl0ZXJhbFZhbHVlKCJcYiIpOwotCQlhc3NlcnRFcXVhbHMoIlwiXFxiXCIiLCBzbC5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JCXNsLnNldEVzY2FwZWRWYWx1ZSgiXCJcXHUwMzAwXCIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJcdTAzMDAiLCBzbC5nZXRMaXRlcmFsVmFsdWUoKSk7Ci0JCXNsLnNldExpdGVyYWxWYWx1ZSgiXHUwNDAwIik7Ci0JCWFzc2VydEVxdWFscygiXCJcXHUwNDAwXCIiLCBzbC5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0OGU3My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiB0aGUgdGVzdGluZyBvZiBuZXN0ZWQgZmllbGQgYWNjZXNzIGZvciBQYXJzZSB0ZXN0aW5nLgotICogVGhpcyBpcyB3aGVuIHlvdSBhY2Nlc3MgYSBmaWVsZCwgYW5kIHRoZW4gYWNjZXNzIGEgZmllbGQgb2YgdGhhdC4KLSAqIEluIHRoaXMgY2FzZSAgPGNvZGU+QVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEuYWNvbG9yLnJlZDwvY29kZT4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEgewotCXB1YmxpYyBzdGF0aWMgQ29sb3IgYWNvbG9yID0gQ29sb3IuZ3JlZW47Ci0JcHVibGljIFJlY3RhbmdsZSBhcmVjdCA9IG5ldyBSZWN0YW5nbGUoMTAsMjAsMzAsNDApOyAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RPcGVyYXRpb25zVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVE9wZXJhdGlvbnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDFkNGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVE9wZXJhdGlvbnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBBU1RPcGVyYXRpb25zVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLkFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlOwotIAotLyoqCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgQVNUT3BlcmF0aW9uc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgd2l0aCBuYW1lLgotCSAqIEBwYXJhbSBuYW1lCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEFTVE9wZXJhdGlvbnNUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIGdldFRyZWVQYXJzZXIoKSB7Ci0JCXJldHVybiAoQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyKSB0ZXN0SGVscGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHdvT3BlcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiMys0IiwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoMys0KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGb3VyT3BlcnNFeHRlbmRlZCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIzKzQrNSs2IiwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoMys0KzUrNikpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRPcGVycygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIzKzQtNSIsIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKDMrNC01KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNaXhlZE9wZXJzUHJlY2VkZW5jZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCI2IHwgMys0IHwgOCIsIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKDYgfCAzKzQgfCA4KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJqYXZhLmF3dC5Db2xvci5yZWQgIT0gbnVsbCA/IDMgOiA1IiwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoamF2YS5hd3QuQ29sb3IucmVkICE9IG51bGwgPyAzIDogNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZW9mKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoImphdmEuYXd0LkNvbG9yLnJlZCBpbnN0YW5jZW9mIGphdmEuYXd0LkNvbG9yIiwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgodHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGl0ZXJhbCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJPYmplY3QuY2xhc3MiLCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5PYmplY3QiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQbHVzT3BlcmF0aW9ucygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIzK1wiYVwiIiwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoMysiYSIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1BsdXNPcGVyYXRpb25zMSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJcImFcIiszIiwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoImEiKzMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1BsdXNFeHRlbmRlZE9wZXJhdGlvbnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiMys0K1wiYVwiIiwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoMys0KyJhIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUGx1c0V4dGVuZGVkT3BlcmF0aW9uczEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiMytcImFcIis0IiwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoMysiYSIrNCkpOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RQYXJzZXJTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVFBhcnNlclN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMzkwNGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVFBhcnNlclN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0vKgotICogICRSQ1NmaWxlOiBBU1RQYXJzZXJTdWl0ZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo1NiAkIAotICovCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhUHJvamVjdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFUZXN0c1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuUHJveHlTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci4qOwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFTVFBhcnNlclN1aXRlIGV4dGVuZHMgVGVzdFNldHVwIHsKLQotCS8vIFRlc3QgY2FzZXMgdG8gYmUgaW5jbHVkZSBpbiB0aGUgc3VpdGUKLQlwcml2YXRlIHN0YXRpYyBDbGFzcyB0ZXN0c0xpc3RbXSA9IHsKLQkJTmVlZHNDb2RpbmdUZXN0LmNsYXNzLAotCQlCbG9ja1Rlc3QuY2xhc3MsCi0JCUFTVEZpZWxkQWNjZXNzVGVzdC5jbGFzcywKLQkJQVNUQXJyYXlzVGVzdC5jbGFzcywKLQkJTXVsdGlBcmdTdGF0aWNNZXRob2RUZXN0LmNsYXNzLAotCQlNdWx0aUFyZ0NvbnN0cnVjdG9yVGVzdC5jbGFzcywKLQkJTXVsdGlBcmdJbnN0YW5jZVRlc3QuY2xhc3MsCi0JCU51bWJlclRlc3QuY2xhc3MsCi0JCUNhc3RUZXN0LmNsYXNzLAotLy8JCUV4Y2VwdGlvblRlc3QuY2xhc3MsCS8vIG1peGVzIHBhcnNlIGVycm9yIHcvZXhlY3V0aW9uIGVycm9ycy4gQ2FuJ3QgdGVzdCBwYXJzZSBlcnJvcnMuIE5lZWQgc3BlY2lmaWMgdGVzdCBmb3IgZXhlYyBlcnJvcnMgbGlrZSBtZXRob2Qgbm90IGZvdW5kLgotCQlMaXRlcmFsVGVzdC5jbGFzcywKLQkJU3RyaW5nVGVzdC5jbGFzcywKLQkJQ2hhclRlc3QuY2xhc3MsCi0JCUpGQ1Rlc3QuY2xhc3MsCi0JCUJvcmRlclRlc3QuY2xhc3MsCi0JCU92ZXJsb2FkaW5nVGVzdC5jbGFzcywKLQkJU2FtZU5hbWU0NjM3NlRlc3QuY2xhc3MsCi0JCUFTVE9wZXJhdGlvbnNUZXN0LmNsYXNzLAotCQlBU1RJbm5lckNsYXNzQWNjZXNzVGVzdC5jbGFzcywKLQkJQVNUTWlzY1Rlc3QuY2xhc3MsCi0JCVRlc3RDb21wYXRpYmxlTWV0aG9kcy5jbGFzcywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBrZ05hbWUgPSAib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZSIgOwotCSAgICAKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFja2FnZVN1aXRlLgotCSAqLwotCXB1YmxpYyBBU1RQYXJzZXJTdWl0ZSgpIHsKLQkJdGhpcygiQVNUIFBhcnNlciBTdWl0ZSIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWNrYWdlU3VpdGUuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQVNUUGFyc2VyU3VpdGUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmV3IFRlc3RTdWl0ZShuYW1lKSk7Ci0JCXBvcHVsYXRlU3VpdGUoKSA7Ci0JfQotCi0JUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU3VpdGUgKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSAoVGVzdFN1aXRlKSBnZXRUZXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTx0ZXN0c0xpc3QubGVuZ3RoOyBpKyspCi0JCSAgc3VpdGUuYWRkVGVzdFN1aXRlKHRlc3RzTGlzdFtpXSkgOwotCQkKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBKYXZhUHJvamVjdFV0aWwuY3JlYXRlRW1wdHlKYXZhUHJvamVjdChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCksIG5ldyBQYXRoKEFTVF9QUk9KRUNUKSwgbnVsbCk7Ci0JCQlJSmF2YVByb2plY3QganByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkvLyBBZGQgamF2YXRlc3RzLmphciAoaS5lLiB0aGlzIHBsdWdpbnMgamFyKSBzbyB0aGF0IHRoZSBjbGFzc2VzIHdpdGhpbiB0aGUgdGVzdHMgamFyIGFyZSBhdmFpbGFibGUKLQkJCS8vIHRvIHRoZSBqZHQgcGFyc2VyIGZvciByZWZlcmVuY2luZy4KLQkJCUphdmFQcm9qZWN0VXRpbC5hZGRCdW5kbGVKYXJUb1BhdGgoSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCAiamF2YXRlc3RzLmphciIsIGpwcm9qZWN0LCBudWxsKTsKLQkJCQotCQkJLy8gV2UncmUgZ29pbmcgdG8gdXNlIHRoZSByZW1vdGUgcHJveHksIGJlY2F1c2UgaXQgaXMgZWFzaWVyIHRvIHN0YXJ0IHVwLCBidXQgd2UgYXJlbid0IHJlYWxseSB0ZXN0aW5nCi0JCQkvLyB0aGUgcmVtb3RlIHByb3h5IGV4cHJlc3Npb24gZXZhbHVhdGlvbi4gV2UgYXJlIHJlYWxseSB0ZXN0aW5nIEFTVC0+UGFyc2VUcmVlLT5CZWFuUHJveHkuIElmIGFueSBleHByZXNzaW9uCi0JCQkvLyB0eXBlIGVycm9ycyBzaG93IHVwIChpLmUuIHRoZSBwcm94eSBleHByZXNzaW9uIGl0c2VsZiBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHkpLiBUaGVuIHRoYXQgc2hvdWxkIGJlIGZpeGVkCi0JCQkvLyBhbmQgYSBqdW5pdCB0ZXN0IGluIHRoZSBwcm94eSBzdWl0ZSBzaG91bGQgYmUgY3JlYXRlZCBpbnN0ZWFkLgotCQkJcmVnaXN0cnkgPSBQcm94eUxhdW5jaFN1cHBvcnQuc3RhcnRJbXBsZW1lbnRhdGlvbigKLQkJCQkJcHJvamVjdCwKLQkJCQkJIkpVbml0IFBhcnNlIFRyZWUgVGVzdCIsCi0JCQkJCW5ldyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10geyBQcm94eVN1aXRlLmdldFByb3h5U3VpdGVDb250cmlidXRvcigpfSwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkKLQkJCUFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlLmluaXRTdWl0ZShzdWl0ZSwgbmV3IEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcihwcm9qZWN0LCByZWdpc3RyeSkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUFzc2VydC5hc3NlcnROb3ROdWxsKGUpOwotCQl9Ci0JfQotICAgIAotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBBU1RQYXJzZXJTdWl0ZSgiVGVzdCBmb3I6ICIrcGtnTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTVF9QUk9KRUNUID0gIi9BU1QgdGVzdHMvIjsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotCQkJcmVnaXN0cnkudGVybWluYXRlUmVnaXN0cnkoKTsKLQkJCVRocmVhZC5zbGVlcCg1MDAwKTsJLy8gR2l2ZSBpdCBmaXZlIHNlY29uZHMgdG8gUkVBTExZIGdvIGF3YXkuIFRoZXJlIGlzIGEgc21hbGwgd2luZG93IGJldHdlZW4gCi0JCQkvLyB0ZXJtaW5hdGUgcmVxdWVzdCBhbmQgdHJ1ZSBzaHV0ZG93biBvZiB0aGUgcmVtb3RlIHZtLiBXZSByZXR1cm4gaW1tZWRpYXRlbHkgYW5kIGxldCBhCi0JCQkvLyBqb2Igd2FpdCBmb3IgdGhlIGFjdHVhbCB0cnVlIHRlcm1pbmF0aW9uLgotCQl9Ci0JCQotCQlKYXZhUHJvamVjdFV0aWwuZGVsZXRlUHJvamVjdChKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChBU1RfUFJPSkVDVCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjI5YjIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5BYnN0cmFjdEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS4qOwotIAotLyoqCi0gKiBJbml0IFN0cmluZyBwYXJzZXIgaGVscGVyIGZvciB3b3JraW5nIHdpdGggQVNUIHRyZWVzLgotICogIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgZXh0ZW5kcyBBYnN0cmFjdEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9DTEFTUyA9ICJwdWJsaWMgY2xhc3MgVEVNUExBVEUgJ3snXG4gIHB1YmxpYyB2b2lkIHRlc3QoKSAneydcbiAgICBTdHJpbmcudmFsdWVPZih7MH0pO1x0Ly8gYSBsaW5lIGNvbW1lbnRcbiAgfVxufSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0NMQVNTX0lNUE9SVFMgPSAiezB9XG5wdWJsaWMgY2xhc3MgVEVNUExBVEUgJ3snXG4gIHB1YmxpYyB2b2lkIHRlc3QoKSAneydcbiAgICBTdHJpbmcudmFsdWVPZih7MX0pO1xuICB9XG59IjsKLQkKLQlwcml2YXRlIElKYXZhUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUIHBhcnNlciA9IG5ldyBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QobmV3IEFTVEJvdW5kUmVzb2x2ZXIoKSk7Ci0JcHJpdmF0ZSBQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeTsKLQkKLQlwdWJsaWMgQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyKCkgewotCX0KLQkKLQlwdWJsaWMgQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyKElQcm9qZWN0IHByb2plY3QsIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXRoaXMucHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCX0KLQkKLQlwdWJsaWMgQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcyhwcm9qZWN0LCBudWxsKTsKLQl9CQotCQotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5BYnN0cmFjdEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyI3Rlc3RJbml0U3RyaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluaXRTdHJpbmcoU3RyaW5nIGFTdHJpbmcsIE9iamVjdCBleHBlY3RlZFJlc3VsdCwgYm9vbGVhbiB0aHJvd3NFeGNlcHRpb24sIGJvb2xlYW4gZXF1YWxzT25seSkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCVN0cmluZyB0ZXN0Q2xhc3MgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChURU1QTEFURV9DTEFTUywgbmV3IE9iamVjdFtdIHthU3RyaW5nfSk7Ci0JCUFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsKLQkJcGFyc2VyLnNldFNvdXJjZSh0ZXN0Q2xhc3MudG9DaGFyQXJyYXkoKSk7Ci0JCXBhcnNlci5zZXRVbml0TmFtZSgiVEVNUExBVEUuamF2YSIpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlwYXJzZXIuc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJCXBhcnNlci5zZXRSZXNvbHZlQmluZGluZ3ModHJ1ZSk7Ci0JCX0KLQkJQ29tcGlsYXRpb25Vbml0IGN1ICA9IChDb21waWxhdGlvblVuaXQpIHBhcnNlci5jcmVhdGVBU1QobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJLy8gVGhpcyBpcyB0aGUgb25seSBtZXRob2QgdGhhdCBpcyBjYWxsZWQgZnJvbSBib3RoIGluaXQgc3RyaW5nIGFuZCBwYXJzZSBhbGxvY2F0aW9uLiBTbyB3ZSBjYW4gYmUgYXNzdW1lIHRoYXQKLQkJLy8gaXQgaXMgYSBzdHJhaWdodCBpbml0IHN0cmluZy4gSW4gdGhhdCBjYXNlIHdlIGNhbiBnbyBhaGVhZCBhbmQgZG8gcmVndWxhciBwcm94eSBpbml0IHN0cmluZyBwYXJzaW5nIHRvCi0JCS8vIGdldCBhIHByb3h5IHRvIHBhc3MgaW50byB0aGUgcGFyc2UgdGVzdGluZy4KLQkJSUJlYW5Qcm94eSBleHBlY3RlZFByb3h5ID0gbnVsbDsKLQkJaWYgKGV4cGVjdGVkUmVzdWx0IGluc3RhbmNlb2YgSUJlYW5Qcm94eSkKLQkJCWV4cGVjdGVkUHJveHkgPSAoSUJlYW5Qcm94eSkgZXhwZWN0ZWRSZXN1bHQ7Ci0JCWVsc2UgaWYgKGV4cGVjdGVkUmVzdWx0ICE9IG51bGwgJiYgIXRocm93c0V4Y2VwdGlvbiAmJiByZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQlleHBlY3RlZFByb3h5ID0gcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eUZyb20oYVN0cmluZyk7Ci0JCX0KLQkJdGVzdEluaXRTdHJpbmcoYVN0cmluZywgY3UsIGV4cGVjdGVkUHJveHksIHRocm93c0V4Y2VwdGlvbiwgZXF1YWxzT25seSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaXRTdHJpbmcoU3RyaW5nIGFTdHJpbmcsIFN0cmluZ1tdIGltcG9ydHMsIElCZWFuUHJveHkgZXhwZWN0ZWRSZXN1bHQpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SW5pdFN0cmluZyhhU3RyaW5nLCBpbXBvcnRzLGV4cGVjdGVkUmVzdWx0LCBmYWxzZSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbml0U3RyaW5nKFN0cmluZyBhU3RyaW5nLCBTdHJpbmdbXSBpbXBvcnRzLCBJQmVhblByb3h5IGV4cGVjdGVkUmVzdWx0LCBib29sZWFuIHRocm93c0V4Y2VwdGlvbiwgYm9vbGVhbiBlcXVhbHNPbmx5KSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJU3RyaW5nQnVmZmVyIGltcG9ydExpbmVzID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCWltcG9ydExpbmVzLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJaW1wb3J0TGluZXMuYXBwZW5kKGltcG9ydHNbaV0pOwotCQkJaW1wb3J0TGluZXMuYXBwZW5kKCI7XG4iKTsKLQkJfQotCQlTdHJpbmcgdGVzdENsYXNzID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoVEVNUExBVEVfQ0xBU1NfSU1QT1JUUywgbmV3IE9iamVjdFtdIHtpbXBvcnRMaW5lcywgYVN0cmluZ30pOwotCQlBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7Ci0JCXBhcnNlci5zZXRTb3VyY2UodGVzdENsYXNzLnRvQ2hhckFycmF5KCkpOwotCQlwYXJzZXIuc2V0VW5pdE5hbWUoIlRFTVBMQVRFLmphdmEiKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJcGFyc2VyLnNldFByb2plY3QocHJvamVjdCk7Ci0JCQlwYXJzZXIuc2V0UmVzb2x2ZUJpbmRpbmdzKHRydWUpOwotCQl9Ci0JCUNvbXBpbGF0aW9uVW5pdCBjdSAgPSAoQ29tcGlsYXRpb25Vbml0KSBwYXJzZXIuY3JlYXRlQVNUKG51bGwpOwotCQl0ZXN0SW5pdFN0cmluZyhhU3RyaW5nLCBjdSwgZXhwZWN0ZWRSZXN1bHQsIHRocm93c0V4Y2VwdGlvbiwgZXF1YWxzT25seSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlc3RJbml0U3RyaW5nKAotCQlTdHJpbmcgYVN0cmluZywKLQkJQ29tcGlsYXRpb25Vbml0IGN1LAotCQlJQmVhblByb3h5IGV4cGVjdGVkUmVzdWx0LAotCQlib29sZWFuIHRocm93c0V4Y2VwdGlvbiwKLQkJYm9vbGVhbiBlcXVhbHNPbmx5KQotCQl0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSVByb2JsZW1bXSBwcm9ibGVtcyA9IGN1LmdldFByb2JsZW1zKCk7Ci0JCWlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7Ci0JCQlib29sZWFuIGVycm9ycyA9IGZhbHNlOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQllcnJvcnMgPSBlcnJvcnMgfCBwcm9ibGVtc1tpXS5pc0Vycm9yKCk7Ci0JCQkJYnVmLmFwcGVuZCgiICIgKyBwcm9ibGVtc1tpXS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJLy8gSWYgb25seSB3YXJuaW5ncywgdHJ5IGdvaW5nIG9uLiBPbmx5IGVycm9ycyBzaG91bGQgY2F1c2UgYSBmYWlsdXJlLgotCQkJaWYgKGVycm9ycykKLQkJCQlpZiAoIXRocm93c0V4Y2VwdGlvbikKLQkJCQkJQXNzZXJ0LmZhaWwoIlByb2JsZW1zIHdpdGggXCIiICsgYVN0cmluZyArICJcIjogIiArIGJ1Zik7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm47IC8vIFRyZWF0IHRoaXMgYXMgYW4gZXhjZXB0aW9uLgotCQkJZWxzZSB7Ci0JCQkJLy8gRWxzZSBqdXN0IGxvZyB0aGUgd2FybmluZ3MuCi0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJXYXJuaW5ncyBvY3VycmVkIGZvciBcIiIgKyBhU3RyaW5nICsgIlwiOiIgKyBidWYpOwotCQkJfQotCQl9Ci0KLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gKFR5cGVEZWNsYXJhdGlvbikgY3UudHlwZXMoKS5nZXQoMCk7Ci0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXMgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgdGQuZ2V0TWV0aG9kcygpWzBdLmdldEJvZHkoKS5zdGF0ZW1lbnRzKCkuZ2V0KDApOwotCQlNZXRob2RJbnZvY2F0aW9uIG1pID0gKE1ldGhvZEludm9jYXRpb24pIGVzLmdldEV4cHJlc3Npb24oKTsKLQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb24gZXhwID0gKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uKSBtaS5hcmd1bWVudHMoKS5nZXQoMCk7Ci0JCVBURXhwcmVzc2lvbiBwYXJzZUV4cCA9IHBhcnNlci5jcmVhdGVFeHByZXNzaW9uKGV4cCk7Ci0KLQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCVBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvciB2ID0gbmV3IFBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvcigpOwotCQkJdHJ5IHsKLQkJCQlJQmVhblByb3h5IGJlYW4gPSB2LmdldEJlYW5Qcm94eShwYXJzZUV4cCwgcmVnaXN0cnkpOwotCQkJCWlmICh0aHJvd3NFeGNlcHRpb24pCi0JCQkJCUFzc2VydC5mYWlsKCJTaG91bGQgb2YgdGhyb3duIGV4Y2VwdGlvbi4gSW5zdGVhZCByZXN1bHQgd2FzIFwiIiArIChiZWFuICE9IG51bGwgPyBiZWFuLnRvQmVhblN0cmluZygpIDogbnVsbCkgKyAiXCIiKTsKLQkJCQlpZiAoYmVhbiA9PSBleHBlY3RlZFJlc3VsdCkKLQkJCQkJcmV0dXJuOwotCQkJCWlmICgoYmVhbiA9PSBudWxsICYmIGV4cGVjdGVkUmVzdWx0ICE9IG51bGwpIHx8IChleHBlY3RlZFJlc3VsdCA9PSBudWxsICYmIGJlYW4gIT0gbnVsbCkpCi0JCQkJCUFzc2VydC5mYWlsKAotCQkJCQkJIkV4cGVjdGVkUmVzdWx0PSIKLQkJCQkJCQkrIChleHBlY3RlZFJlc3VsdCAhPSBudWxsID8gZXhwZWN0ZWRSZXN1bHQudG9CZWFuU3RyaW5nKCkgOiBudWxsKQotCQkJCQkJCSsgIiByZXN1bHQ9IgotCQkJCQkJCSsgKGJlYW4gIT0gbnVsbCA/IGJlYW4udG9CZWFuU3RyaW5nKCkgOiBudWxsKSk7Ci0JCQkJaWYgKGJlYW4uZXF1YWxzKGV4cGVjdGVkUmVzdWx0KSkKLQkJCQkJcmV0dXJuOwotCQkJCS8vIEl0IG1heSBiZSB0aGF0IHRoZSBlcXVhbHMgZXhwcmVzc2lvbiBpcyBiYWQuIElmIHNvIHVzZSB0aGUgdG9TdHJpbmcoKSB0byBkbwotCQkJCS8vIGEgcGFydGlhbCBjb21wYXJpc29uCi0JCQkJaWYgKGJlYW4uZ2V0VHlwZVByb3h5KCkgPT0gZXhwZWN0ZWRSZXN1bHQuZ2V0VHlwZVByb3h5KCkpIHsKLQkJCQkJaWYgKGJlYW4udG9CZWFuU3RyaW5nKCkuZXF1YWxzKGV4cGVjdGVkUmVzdWx0LnRvQmVhblN0cmluZygpKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gVGhlIHRvU3RyaW5ncyBkbyBub3QgbWF0Y2ggcGVyZmVjdGx5IGJ1dCB0aGUgY2xhc3NlcyBkby4KLQkJCQkJCS8vIFRyeSBhbmQgc2VlIGhvdyBjbG9zZSB0aGUgdHdvIHN0cmluZ3MgYXJlCi0JCQkJCQlpZiAoZXhwZWN0ZWRSZXN1bHQuZ2V0VHlwZVByb3h5KCkuaXNBcnJheSgpICYmIGJlYW4uZ2V0VHlwZVByb3h5KCkuaXNBcnJheSgpKSB7Ci0JCQkJCQkJSUJlYW5UeXBlUHJveHkgZXhwZWN0ZWRSZXN1bHRDbGFzcyA9ICgoSUFycmF5QmVhblR5cGVQcm94eSkgZXhwZWN0ZWRSZXN1bHQuZ2V0VHlwZVByb3h5KCkpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQkJCQlJQmVhblR5cGVQcm94eSByZXN1bHRDbGFzcyA9ICgoSUFycmF5QmVhblR5cGVQcm94eSkgYmVhbi5nZXRUeXBlUHJveHkoKSkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCQkJCWludCByZXN1bHRMZW5ndGggPSAoKElBcnJheUJlYW5Qcm94eSkgYmVhbikuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJaW50IGV4cGVjdGVkTGVuZ3RoID0gKChJQXJyYXlCZWFuUHJveHkpIGV4cGVjdGVkUmVzdWx0KS5nZXRMZW5ndGgoKTsKLQkJCQkJCQlpZiAoZXhwZWN0ZWRMZW5ndGggPT0gcmVzdWx0TGVuZ3RoKSB7Ci0JCQkJCQkJCWlmIChyZXN1bHRDbGFzcyA9PSBleHBlY3RlZFJlc3VsdENsYXNzKSB7Ci0JCQkJCQkJCQkvLyBUT0RPIFNob3VsZCBhY3R1YWxseSBzdGVwIGluIGFuZCBjaGVjayBlYWNoIGVsZW1lbnQgdG9vLgotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJQXNzZXJ0LmZhaWwoCi0JCQkJCQkJCQkJYVN0cmluZwotCQkJCQkJCQkJCQkrICIgRXhwZWN0ZWRSZXN1bHQ9IgotCQkJCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0LnRvQmVhblN0cmluZygpCi0JCQkJCQkJCQkJCSsgIiBBY3R1YWxSZXN1bHQ9IgotCQkJCQkJCQkJCQkrIGJlYW4udG9CZWFuU3RyaW5nKCkKLQkJCQkJCQkJCQkJKyAiIEV4cGVjdGVkQ2xhc3M9IgotCQkJCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkKLQkJCQkJCQkJCQkJKyAiIEFjdHVhbENsYXNzPSIKLQkJCQkJCQkJCQkJKyBiZWFuLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJQXNzZXJ0LmZhaWwoCi0JCQkJCQkJCQlhU3RyaW5nCi0JCQkJCQkJCQkJKyAiIEV4cGVjdGVkUmVzdWx0PSIKLQkJCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0LnRvQmVhblN0cmluZygpCi0JCQkJCQkJCQkJKyAiIEFjdHVhbFJlc3VsdD0iCi0JCQkJCQkJCQkJKyBiZWFuLnRvQmVhblN0cmluZygpCi0JCQkJCQkJCQkJKyAiIEV4cGVjdGVkQ2xhc3M9IgotCQkJCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKQotCQkJCQkJCQkJCSsgIiBBY3R1YWxDbGFzcz0iCi0JCQkJCQkJCQkJKyBiZWFuLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKGVxdWFsc09ubHkpCi0JCQkJCQkJCUFzc2VydC5mYWlsKAotCQkJCQkJCQkJYVN0cmluZwotCQkJCQkJCQkJCSsgIiBFeHBlY3RlZFJlc3VsdD0iCi0JCQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdC50b0JlYW5TdHJpbmcoKQotCQkJCQkJCQkJCSsgIiBBY3R1YWxSZXN1bHQ9IgotCQkJCQkJCQkJCSsgYmVhbi50b0JlYW5TdHJpbmcoKQotCQkJCQkJCQkJCSsgIiBFeHBlY3RlZENsYXNzPSIKLQkJCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkKLQkJCQkJCQkJCQkrICIgQWN0dWFsQ2xhc3M9IgotCQkJCQkJCQkJCSsgYmVhbi5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlBc3NlcnQuZmFpbCgKLQkJCQkJCWFTdHJpbmcKLQkJCQkJCQkrICIgRXhwZWN0ZWRSZXN1bHQ9IgotCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQudG9CZWFuU3RyaW5nKCkKLQkJCQkJCQkrICIgQWN0dWFsUmVzdWx0PSIKLQkJCQkJCQkrIGJlYW4udG9CZWFuU3RyaW5nKCkKLQkJCQkJCQkrICIgRXhwZWN0ZWRDbGFzcz0iCi0JCQkJCQkJKyBleHBlY3RlZFJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpCi0JCQkJCQkJKyAiIEFjdHVhbENsYXNzPSIKLQkJCQkJCQkrIGJlYW4uZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAodGhyb3dzRXhjZXB0aW9uKQotCQkJCQlyZXR1cm47IC8vIFRoaXMgaXMgb2ssIGl0IHNob3VsZCBvZiB0aHJvd24gZXhjZXB0aW9uLgotCQkJCWVsc2UKLQkJCQkJdGhyb3cgZTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0lubmVyQ2xhc3NUZXN0RGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0lubmVyQ2xhc3NUZXN0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDEzZjJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Jbm5lckNsYXNzVGVzdERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElubmVyQ2xhc3NUZXN0RGF0YS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotIAotLyoqCi0gKiBUaGlzIGlzIGZvciB0ZXN0aW5nIGlubmVyIGNsYXNzIGFjY2Vzcy4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgSW5uZXJDbGFzc1Rlc3REYXRhIHsKLQotCS8qKgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5uZXJJbm5lckNsYXNzIGV4dGVuZHMgT2JqZWN0IHsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBHUkVFTiA9IENvbG9yLmdyZWVuOwotCi0JCS8qKgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGNsYXNzIElubmVySW5uZXJJbm5lckNsYXNzIGV4dGVuZHMgT2JqZWN0IHsKLQkJCXB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgUkVEID0gQ29sb3IucmVkOyAKLQotCQkJLyoqCi0JCQkgKiAKLQkJCSAqIEBzaW5jZSAxLjAuMAotCQkJICovCi0JCQlwdWJsaWMgY2xhc3MgSW5uZXJJbm5lcklubmVySW5uZXJDbGFzcyB7Ci0KLQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCQkJCSAqLwotCQkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQkJCXJldHVybiBzdXBlci5lcXVhbHMob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBJbm5lcklubmVySW5uZXJJbm5lckNsYXNzOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiBzdXBlci5lcXVhbHMob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBJbm5lcklubmVySW5uZXJDbGFzczsKLQkJCX0KLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopIHx8IG9iaiBpbnN0YW5jZW9mIElubmVySW5uZXJDbGFzczsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopIHx8IG9iaiBpbnN0YW5jZW9mIElubmVyQ2xhc3NUZXN0RGF0YTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvVGVzdENvbXBhdGlibGVNZXRob2RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvVGVzdENvbXBhdGlibGVNZXRob2RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMmU1YzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL1Rlc3RDb21wYXRpYmxlTWV0aG9kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVGVzdENvbXBhdGlibGVNZXRob2RzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDYvMDMvMTkgMTg6Mjc6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkZvckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5Ob0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5BYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZTsKLSAKLQotLyoqCi0gKiAKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbXBhdGlibGVNZXRob2RzIGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgVGVzdENvbXBhdGlibGVNZXRob2RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgZ2V0VHJlZVBhcnNlcigpIHsKLQkJcmV0dXJuIChBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIpIHRlc3RIZWxwZXI7Ci0JfQotCQotCXByb3RlY3RlZCBJQmVhblByb3h5IGV4ZWN1dGVRUVEoSUJlYW5Qcm94eSBhMSwgSUJlYW5Qcm94eSBhMikgdGhyb3dzIFRocm93YWJsZVByb3h5LCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKTsKLQkJSUV4cHJlc3Npb24gZXhwID0gcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgInFxcSIsIHRydWUsIDIpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX1JFQ0VJVkVSLCAib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5UZXN0Q29tcGF0aWJsZU1ldGhvZHNEYXRhMSIsIDApOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX0FSR1VNRU5ULCBhMSk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfQVJHVU1FTlQsIGEyKTsKLQkJcmV0dXJuIGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFtYmlndW91cygpIHRocm93cyBUaHJvd2FibGUgewotCQlQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpOwotCQl0cnkgewotCQkJZXhlY3V0ZVFRUShyZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChuZXcgSW50ZWdlcigxKSksIHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKAotCQkJCQluZXcgSW50ZWdlcigxKSkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlpZiAoZS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLmVxdWFscygib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5BbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24iKSkKLQkJCQlyZXR1cm47CS8vIFRoaXMgaXMgZ29vZC4KLQkJCXRocm93IGU7Ci0JCX0JCQotCQlmYWlsKCJTaG91bGQgb2YgdGhyb3duIGFtYmlxdW91cy4iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEV4YWN0TWF0Y2goKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKTsKLQkJSUludGVnZXJCZWFuUHJveHkgcmVzdWx0ID0gKElJbnRlZ2VyQmVhblByb3h5KSBleGVjdXRlUVFRKHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKG5ldyBJbnRlZ2VyKDEpKSwgcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eUZyb20oIm5ldyBPYmplY3QoKSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc3VsdC5pbnRWYWx1ZSgpKTsKLQkJCi0JCXJlc3VsdCA9IChJSW50ZWdlckJlYW5Qcm94eSkgZXhlY3V0ZVFRUShyZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5RnJvbSgibmV3IE9iamVjdCgpIiksIHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlGcm9tKCJuZXcgT2JqZWN0KCkiKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXN1bHQuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb21wYXRpYmxlTWF0Y2goKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKTsKLQkJSUludGVnZXJCZWFuUHJveHkgcmVzdWx0ID0gKElJbnRlZ2VyQmVhblByb3h5KSBleGVjdXRlUVFRKHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKG5ldyBGbG9hdCgxKSksIHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKG5ldyBJbnRlZ2VyKDEpKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXN1bHQuaW50VmFsdWUoKSk7Ci0KLQkJcmVzdWx0ID0gKElJbnRlZ2VyQmVhblByb3h5KSBleGVjdXRlUVFRKHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKG5ldyBGbG9hdCgxKSksIHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlGcm9tKCJuZXcgT2JqZWN0KCkiKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXN1bHQuaW50VmFsdWUoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL1Rlc3RDb21wYXRpYmxlTWV0aG9kc0RhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9UZXN0Q29tcGF0aWJsZU1ldGhvZHNEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYTUyZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL1Rlc3RDb21wYXRpYmxlTWV0aG9kc0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RDb21wYXRpYmxlTWV0aG9kc0RhdGEuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNi8wMy8xOSAxODoyNzoxMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0gCi0KLS8qKgotICogVXNlZCB0byB0ZXN0IGNvbXBhdGlibGUgbWV0aG9kcyBzZWFyY2hpbmcuCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb21wYXRpYmxlTWV0aG9kc0RhdGEgewotCi0JcHJvdGVjdGVkIHZvaWQgdCgpIHsKLQkJcXFxKG5ldyBJbnRlZ2VyKDEpLCBuZXcgT2JqZWN0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IHFxcShPYmplY3QgbywgT2JqZWN0IG8xKSB7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlwcml2YXRlIGludCBxcXEoSW50ZWdlciBpLCBPYmplY3QgbykgewotCQlyZXR1cm4gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL1Rlc3RDb21wYXRpYmxlTWV0aG9kc0RhdGExLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvVGVzdENvbXBhdGlibGVNZXRob2RzRGF0YTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4ZTQ4OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvVGVzdENvbXBhdGlibGVNZXRob2RzRGF0YTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RDb21wYXRpYmxlTWV0aG9kc0RhdGExLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDYvMDMvMTkgMTg6Mjc6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi0gCi0KLS8qKgotICogVXNlZCBmb3IgdGVzdGluZyBtb3N0IGNvbXBhdGlibGUgcHJvdGVjdGVkIG1ldGhvZHMKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbXBhdGlibGVNZXRob2RzRGF0YTEgZXh0ZW5kcyBUZXN0Q29tcGF0aWJsZU1ldGhvZHNEYXRhIHsKLQotCXByb3RlY3RlZCBpbnQgcXFxKE51bWJlciBuLCBJbnRlZ2VyIGkxKSB7Ci0JCXJldHVybiAxOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IHFxcShJbnRlZ2VyIGksIE9iamVjdCBvMSkgewotCQlyZXR1cm4gMjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3JlbW90ZS9SZW1vdGVQcm94eVN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9yZW1vdGUvUmVtb3RlUHJveHlTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTFlZGZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3JlbW90ZS9SZW1vdGVQcm94eVN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSZW1vdGVQcm94eVN1aXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjExICQgICREYXRlOiAyMDA2LzA5LzE0IDE4OjMxOjA2ICQgCi0gKi8KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhUHJvamVjdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFUZXN0c1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuQWJzdHJhY3RUZXN0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LlByb3h5U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqIFRoaXMgaXMgdGhlIHRydWUgdGVzdCBzdWl0ZSBmb3IgUmVtb3RlIFByb3h5IFRlc3RpbmcuIFRoZSBSZW1vdGVQcm94eVRlc3Qgd2lsbCB1c2UgdGhpcy4KLSAqLwotcHVibGljIGNsYXNzIFJlbW90ZVByb3h5U3VpdGUgZXh0ZW5kcyBUZXN0U2V0dXAgewotCi0JLy8gVGVzdCBjYXNlcyB0byBiZSBpbmNsdWRlIGluIHRoZSBzdWl0ZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIHRlc3RzTGlzdFtdID0geyBQcm94eVN1aXRlLmNsYXNzLCBUZXN0UHJvamVjdEFjY2Vzcy5jbGFzcywgfTsKLQotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsgLy8gVGhlIHByb2plY3QgdG8gc3RhcnQgdGhlIHByb3h5IGZhY3Rvcnkgb24uCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JcHJpdmF0ZSBBYnN0cmFjdFRlc3RQcm94eS5SZWdpc3RyeUhhbmRsZXIgcmVnaXN0cnlIYW5kbGVyID0gbmV3IEFic3RyYWN0VGVzdFByb3h5LlJlZ2lzdHJ5SGFuZGxlcigpIHsKLQkJcHJpdmF0ZSBQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeTsKLQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQkJcmV0dXJuIHByb2plY3QgIT0gbnVsbDsKLQkJfQotCQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAocmVnaXN0cnkgPT0gbnVsbCkgewotCQkJCXJlZ2lzdHJ5ID0KLQkJCQkJUHJveHlMYXVuY2hTdXBwb3J0LnN0YXJ0SW1wbGVtZW50YXRpb24oCi0JCQkJCQlwcm9qZWN0LAotCQkJCQkJIkpVbml0IFJlbW90ZSBQcm94eSBUZXN0IiwKLQkJCQkJCW5ldyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10geyBQcm94eVN1aXRlLmdldFByb3h5U3VpdGVDb250cmlidXRvcigpfSwKLQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQkJcmV0dXJuIHJlZ2lzdHJ5OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGVzdHJveVJlZ2lzdHJ5KCkgewotCQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCQlyZWdpc3RyeS50ZXJtaW5hdGVSZWdpc3RyeSgpOwotCQkJCXJlZ2lzdHJ5ID0gbnVsbDsKLQkJCX0KLQkJfQotCX07Ci0KLQlwdWJsaWMgUmVtb3RlUHJveHlTdWl0ZSgpIHsKLQkJdGhpcygiVGVzdCBSZW1vdGUgUHJveHkgU3VpdGUiKTsKLQl9Ci0KLQlwdWJsaWMgUmVtb3RlUHJveHlTdWl0ZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuZXcgVGVzdFN1aXRlKG5hbWUpIHsKLQkJCXsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RzTGlzdC5sZW5ndGg7IGkrKykgewotCQkJCQkvLyBXZSBtYXkgZ2V0IHNvbWUgdGVzdHMgYW5kIHN1aXRlcy4KLQkJCQkJaWYgKFRlc3RTdWl0ZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRlc3RzTGlzdFtpXSkgfHwgVGVzdFNldHVwLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGVzdHNMaXN0W2ldKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlUZXN0IHRzID0gKFRlc3QpIHRlc3RzTGlzdFtpXS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCWFkZFRlc3QodHMpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UKLQkJCQkJCWFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJQWJzdHJhY3RUZXN0UHJveHkuaW5pdFJlZ2lzdHJ5SGFuZGxlcigoVGVzdFN1aXRlKSB0aGlzLmdldFRlc3QoKSwgcmVnaXN0cnlIYW5kbGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgUmVtb3RlUHJveHlTdWl0ZSgpOwotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBURVNUX1BST0pFQ1RfTkFNRSA9ICJUZXN0IFJlbW90ZSBQcm94eSI7Ci0JcHJpdmF0ZSBib29sZWFuIG9sZEF1dG9CdWlsZGluZ1N0YXRlOyAvLyBhdXRvQnVpbGRpbmcgc3RhdGUgYmVmb3JlIHdlIHN0YXJ0ZWQuCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLSBJbml0aWFsaXppbmcgdGhlIFByb3h5IFJlbW90ZSB0ZXN0IGRhdGEgLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlvbGRBdXRvQnVpbGRpbmdTdGF0ZSA9IEphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQodHJ1ZSk7Ci0JCVN0cmluZyB6aXBQYXRoID0KLQkJCUZpbGVMb2NhdG9yLnRvRmlsZVVSTChuZXcgVVJMKEphdmFUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpLCAidGVzdGRhdGEvdGVzdHJlbW90ZXByb2plY3QuemlwIikpCi0JCQkJLmdldEZpbGUoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IEphdmFQcm9qZWN0VXRpbC5pbXBvcnRQcm9qZWN0cyhuZXcgU3RyaW5nW10geyBURVNUX1BST0pFQ1RfTkFNRSB9LCBuZXcgU3RyaW5nW10geyB6aXBQYXRoIH0pOwotCQlhc3NlcnROb3ROdWxsKHByb2plY3RzWzBdKTsKLQkJSmF2YVByb2plY3RVdGlsLndhaXRGb3JBdXRvQnVpbGQoKTsJCQotCQlwcm9qZWN0ID0gcHJvamVjdHNbMF07Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gRGF0YSBpbml0aWFsaXplZCAtLSIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZWdpc3RyeUhhbmRsZXIuZGVzdHJveVJlZ2lzdHJ5KCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUwMCk7CS8vIFdhaXQgYmVjYXVzZSBzb21lIHRpbWVzIHRoZSBvdGhlciB2bSBpc24ndCBxdWl0ZSBkb3duIHNvIGEgZmlsZSBzdGF5cyBsb2NrZWQuCi0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCBmYWxzZSwgbnVsbCk7IC8vIEdldCByaWQgb2YgdGhlIHByb2plY3QgYW5kIHRoZSBmaWxlcyB0aGVtc2VsdmVzLgotCQkJcHJvamVjdCA9IG51bGw7Ci0JCX0KLQkJSmF2YVByb2plY3RVdGlsLnNldEF1dG9CdWlsZChvbGRBdXRvQnVpbGRpbmdTdGF0ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9yZW1vdGUvVGVzdFByb2plY3RBY2Nlc3MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3JlbW90ZS9UZXN0UHJvamVjdEFjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTNjMWZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3JlbW90ZS9UZXN0UHJvamVjdEFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogVGVzdFByb2plY3RBY2Nlc3MuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NSAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5BYnN0cmFjdFRlc3RQcm94eTsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogVGVzdCBQcm9qZWN0IEFjY2Vzcy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RQcm9qZWN0QWNjZXNzIGV4dGVuZHMgQWJzdHJhY3RUZXN0UHJveHkgewotCi0JcHVibGljIFRlc3RQcm9qZWN0QWNjZXNzKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUZXN0UHJvamVjdEFjY2VzcyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENsYXNzRnJvbVByb2plY3QoKSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RDbGFzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS50ZXN0aW5nLnByb3h5LnJlbW90ZS5UZXN0Q2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKHRlc3RDbGFzc1R5cGUpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0Q2xhc3NJbnN0YW50aWF0aW9uKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdENsYXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgib3JnLmVjbGlwc2UuamVtLnRlc3RpbmcucHJveHkucmVtb3RlLlRlc3RDbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCUlCZWFuUHJveHkgdGVzdENsYXNzID0gdGVzdENsYXNzVHlwZS5uZXdJbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKHRlc3RDbGFzcyk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdENsYXNzTWV0aG9kKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdENsYXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgib3JnLmVjbGlwc2UuamVtLnRlc3RpbmcucHJveHkucmVtb3RlLlRlc3RDbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCUlNZXRob2RQcm94eSB0ZXN0TWV0aG9kID0gdGVzdENsYXNzVHlwZS5nZXRNZXRob2RQcm94eSgiZ2V0VGVzdFN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwodGVzdE1ldGhvZCk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByb2plY3RDbGFzc01ldGhvZEludm9rZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RDbGFzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS50ZXN0aW5nLnByb3h5LnJlbW90ZS5UZXN0Q2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlJTWV0aG9kUHJveHkgdGVzdE1ldGhvZCA9IHRlc3RDbGFzc1R5cGUuZ2V0TWV0aG9kUHJveHkoImdldFRlc3RTdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCQlJQmVhblByb3h5IHRlc3RDbGFzcyA9IHRlc3RDbGFzc1R5cGUubmV3SW5zdGFuY2UoKTsKLQkJSVN0cmluZ0JlYW5Qcm94eSBhU3RyaW5nID0gKElTdHJpbmdCZWFuUHJveHkpIHRlc3RNZXRob2QuaW52b2tlKHRlc3RDbGFzcyk7Ci0JCWFzc2VydE5vdE51bGwoYVN0cmluZyk7Ci0JCWFzc2VydEVxdWFscygiVEVTVFNUUklORyIsIGFTdHJpbmcuc3RyaW5nVmFsdWUoKSk7CQkKLQl9CQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZWU4YjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUudGVzdHMuZ2l0L3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTUgJAotIwotCi0KLXBsdWdpbk5hbWU9SmF2YSBFTUYgTW9kZWwgSlVuaXQgVGVzdCBDYXNlcwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZWU0MjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnJlZ2lzdHJhdGlvbnMiPgotICAgICAgPHJlZ2lzdHJhdGlvbgotICAgICAgICAgICAgY29udGFpbmVyPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiPgotICAgICAgICAgPG92ZXJyaWRlCi0gICAgICAgICAgICAgICBwYWNrYWdlPSJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8iCi0gICAgICAgICAgICAgICBwYXRoPSJ0ZXN0ZGF0YS9vdmVycmlkZXMvYmVhbmluZm8iPgotICAgICAgICAgPC9vdmVycmlkZT4KLSAgICAgIDwvcmVnaXN0cmF0aW9uPgotCTwvZXh0ZW5zaW9uPgotPCEtLQotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aVRlc3RlciI+Ci0gICAgICAgIDx1aVRlc3RlciBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5VSVRlc3RlciIvPgotICAgICA8L2V4dGVuc2lvbj4KLS0tPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvcHJveHkuamFycyBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9wcm94eS5qYXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTcwMjlhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9wcm94eS5qYXJzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi12bS90ZXN0cy5qYXI9L29yZy5lY2xpcHNlLmplbS50ZXN0cy9iaW4vCi1qYXZhdGVzdHMuamFyPS9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYmluLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1YjFhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0L2xpYnJhcnkueG1sIi8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iamVtLWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qZW1fZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7amVtLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gIAk8IS0tIE5vdGU6IERvZXNuJ3QgcmVhbGx5IG5lZWQgdG8gYmUgVUkgdGVzdCBidXQgbGF1bmNoaW5nIHJlbW90ZSBWTSdzIHdpdGgKLSAgCSAgICAgRGVidWdVSSBwbHVnaW4gcHJlc2VudCBidXQgbm90IGxhdW5jaGluZyBVSSBjYXVzZXMgc2V2ZXJlIGVycnJvcnMKLSAgCSAgICAgYmVjYXVzZSBpdCB0cmllcyB0byBzdGFydCBEZWJ1Z1VJIGluIGhlYWRsZXNzIGVudi4gQmlnIFBhaW4hIC0tPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7amVtLWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzLkFsbFN1aXRlcyIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL0pESzVCaW5UZXN0cy5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvSkRLNUJpblRlc3RzLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4NjJlNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvSkRLNUJpblRlc3RzLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9KREs1VGVzdHMuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL0pESzVUZXN0cy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODhiZDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL0pESzVUZXN0cy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvZXh0amFyb3BzLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9leHRqYXJvcHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWNmYjdkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9leHRqYXJvcHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1nZXRBY3Rpb25Db21tYW5kCi1nZXRMYWJlbAotc2V0QWN0aW9uQ29tbWFuZAotc2V0TGFiZWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9leHRqYXJwcm9wcy50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvZXh0amFycHJvcHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzdlZDYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9leHRqYXJwcm9wcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1hbGlnbm1lbnRYCi1hbGlnbm1lbnRZCi1iYWNrZ3JvdW5kCi1ib3VuZHMKLWNvbG9yTW9kZWwKLWN1cnNvcgotZW5hYmxlZAotZm9jdXNUcmF2ZXJzYWJsZQotY29tcG9uZW50T3JpZW50YXRpb24KLWZvbnQKLWZvcmVncm91bmQKLWdyYXBoaWNzCi1sb2NhbGUKLWxvY2F0aW9uCi1sb2NhdGlvbk9uU2NyZWVuCi1tYXhpbXVtU2l6ZQotbWluaW11bVNpemUKLW5hbWUKLXBhcmVudAotcHJlZmVycmVkU2l6ZQotc2hvd2luZwotc2l6ZQotdG9vbGtpdAotdHJlZUxvY2sKLXZhbGlkCi12aXNpYmxlCi1hY3Rpb25Db21tYW5kCi1sYWJlbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL2psYWJlbG9wcy50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvamxhYmVsb3BzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhZDhkNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvamxhYmVsb3BzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi1oYXNoQ29kZQotbm90aWZ5Ci1ub3RpZnlBbGwKLXdhaXQKLXdhaXQKLXdhaXQKLWdldENsYXNzCi1lcXVhbHMKLXRvU3RyaW5nCi1hZGQKLWFkZE5vdGlmeQotY2hlY2tJbWFnZQotY29udGFpbnMKLWNyZWF0ZUltYWdlCi1jcmVhdGVJbWFnZQotZGlzcGF0Y2hFdmVudAotZG9MYXlvdXQKLWdldEJhY2tncm91bmQKLWdldEJvdW5kcwotZ2V0Q29sb3JNb2RlbAotZ2V0Q3Vyc29yCi1nZXRGb250Ci1nZXRGb250TWV0cmljcwotZ2V0Rm9yZWdyb3VuZAotZ2V0R3JhcGhpY3MKLWdldExvY2FsZQotZ2V0TG9jYXRpb24KLWdldExvY2F0aW9uT25TY3JlZW4KLWdldE1heGltdW1TaXplCi1nZXRNaW5pbXVtU2l6ZQotZ2V0TmFtZQotZ2V0UGFyZW50Ci1nZXRQcmVmZXJyZWRTaXplCi1nZXRTaXplCi1nZXRUb29sa2l0Ci1nZXRUcmVlTG9jawotaW52YWxpZGF0ZQotaXNFbmFibGVkCi1pc1Nob3dpbmcKLWlzVmFsaWQKLWlzVmlzaWJsZQotbGlzdAotbGlzdAotcGFpbnRBbGwKLXByZXBhcmVJbWFnZQotcHJpbnRBbGwKLXJlbW92ZQotcmVtb3ZlTm90aWZ5Ci1yZXBhaW50Ci1yZXF1ZXN0Rm9jdXMKLXNldEJhY2tncm91bmQKLXNldEJvdW5kcwotc2V0Q3Vyc29yCi1zZXRFbmFibGVkCi1zZXRGb3JlZ3JvdW5kCi1zZXRMb2NhbGUKLXNldExvY2F0aW9uCi1zZXRMb2NhdGlvbgotc2V0TmFtZQotc2V0U2l6ZQotc2V0U2l6ZQotdHJhbnNmZXJGb2N1cwotdmFsaWRhdGUKLWFkZAotYWRkCi1hZGQKLWFkZAotYWRkCi1nZXRBbGlnbm1lbnRYCi1nZXRBbGlnbm1lbnRZCi1nZXRDb21wb25lbnQKLWdldENvbXBvbmVudEF0Ci1nZXRDb21wb25lbnRBdAotZ2V0Q29tcG9uZW50Q291bnQKLWdldENvbXBvbmVudHMKLWdldEluc2V0cwotZ2V0TGF5b3V0Ci1pc0FuY2VzdG9yT2YKLWxpc3QKLWxpc3QKLXByaW50Ci1yZW1vdmUKLXJlbW92ZQotcmVtb3ZlQWxsCi1zZXRMYXlvdXQKLWNvbXB1dGVWaXNpYmxlUmVjdAotY29udGFpbnMKLWNyZWF0ZVRvb2xUaXAKLWZpcmVQcm9wZXJ0eUNoYW5nZQotZmlyZVByb3BlcnR5Q2hhbmdlCi1maXJlUHJvcGVydHlDaGFuZ2UKLWZpcmVQcm9wZXJ0eUNoYW5nZQotZmlyZVByb3BlcnR5Q2hhbmdlCi1maXJlUHJvcGVydHlDaGFuZ2UKLWZpcmVQcm9wZXJ0eUNoYW5nZQotZ2V0QWNjZXNzaWJsZUNvbnRleHQKLWdldEFjdGlvbkZvcktleVN0cm9rZQotZ2V0QXV0b3Njcm9sbHMKLWdldEJvcmRlcgotZ2V0Qm91bmRzCi1nZXRDbGllbnRQcm9wZXJ0eQotZ2V0Q29uZGl0aW9uRm9yS2V5U3Ryb2tlCi1nZXRIZWlnaHQKLWdldExvY2F0aW9uCi1nZXROZXh0Rm9jdXNhYmxlQ29tcG9uZW50Ci1nZXRSZWdpc3RlcmVkS2V5U3Ryb2tlcwotZ2V0Um9vdFBhbmUKLWdldFNpemUKLWdldFRvb2xUaXBUZXh0Ci1nZXRUb3BMZXZlbEFuY2VzdG9yCi1nZXRWaXNpYmxlUmVjdAotZ2V0V2lkdGgKLWdldFgKLWdldFkKLWdyYWJGb2N1cwotaGFzRm9jdXMKLWlzRG91YmxlQnVmZmVyZWQKLWlzRm9jdXNDeWNsZVJvb3QKLWlzRm9jdXNUcmF2ZXJzYWJsZQotaXNNYW5hZ2luZ0ZvY3VzCi1pc09wYXF1ZQotaXNPcHRpbWl6ZWREcmF3aW5nRW5hYmxlZAotaXNSZXF1ZXN0Rm9jdXNFbmFibGVkCi1pc1ZhbGlkYXRlUm9vdAotcGFpbnQKLXBhaW50SW1tZWRpYXRlbHkKLXB1dENsaWVudFByb3BlcnR5Ci1yZXBhaW50Ci1yZXF1ZXN0RGVmYXVsdEZvY3VzCi1yZXNldEtleWJvYXJkQWN0aW9ucwotcmV2YWxpZGF0ZQotc2Nyb2xsUmVjdFRvVmlzaWJsZQotc2V0QWxpZ25tZW50WAotc2V0QWxpZ25tZW50WQotc2V0QXV0b3Njcm9sbHMKLXNldEJvcmRlcgotc2V0Qm91bmRzCi1zZXREZWJ1Z0dyYXBoaWNzT3B0aW9ucwotc2V0RG91YmxlQnVmZmVyZWQKLXNldE1heGltdW1TaXplCi1zZXRNaW5pbXVtU2l6ZQotc2V0TmV4dEZvY3VzYWJsZUNvbXBvbmVudAotc2V0T3BhcXVlCi1zZXRQcmVmZXJyZWRTaXplCi1zZXRSZXF1ZXN0Rm9jdXNFbmFibGVkCi1zZXRUb29sVGlwVGV4dAotc2V0VmlzaWJsZQotdW5yZWdpc3RlcktleWJvYXJkQWN0aW9uCi11cGRhdGUKLWdldERpc2FibGVkSWNvbgotZ2V0RGlzcGxheWVkTW5lbW9uaWMKLWdldEhvcml6b250YWxBbGlnbm1lbnQKLWdldEhvcml6b250YWxUZXh0UG9zaXRpb24KLWdldEljb24KLWdldEljb25UZXh0R2FwCi1nZXRMYWJlbEZvcgotZ2V0VGV4dAotZ2V0VUkKLWdldFZlcnRpY2FsQWxpZ25tZW50Ci1nZXRWZXJ0aWNhbFRleHRQb3NpdGlvbgotc2V0RGlzYWJsZWRJY29uCi1zZXREaXNwbGF5ZWRNbmVtb25pYwotc2V0Rm9udAotc2V0SG9yaXpvbnRhbEFsaWdubWVudAotc2V0SG9yaXpvbnRhbFRleHRQb3NpdGlvbgotc2V0SWNvbgotc2V0SWNvblRleHRHYXAKLXNldExhYmVsRm9yCi1zZXRUZXh0Ci1zZXRVSQotc2V0VmVydGljYWxBbGlnbm1lbnQKLXNldFZlcnRpY2FsVGV4dFBvc2l0aW9uCi11cGRhdGVVSQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL2psYWJlbHByb3BzLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9qbGFiZWxwcm9wcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YmM3MDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL2psYWJlbHByb3BzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLWJhY2tncm91bmQKLWJvdW5kcwotY29sb3JNb2RlbAotY3Vyc29yCi1lbmFibGVkCi1mb2N1c1RyYXZlcnNhYmxlCi1mb3JlZ3JvdW5kCi1sb2NhbGUKLWxvY2F0aW9uCi1sb2NhdGlvbk9uU2NyZWVuCi1jb21wb25lbnRPcmllbnRhdGlvbgotbmFtZQotcGFyZW50Ci1zaG93aW5nCi1zaXplCi10b29sa2l0Ci10cmVlTG9jawotdmFsaWQKLXZpc2libGUKLWNvbXBvbmVudENvdW50Ci1jb21wb25lbnRzCi1sYXlvdXQKLWFsaWdubWVudFgKLWFsaWdubWVudFkKLWF1dG9zY3JvbGxzCi1ib3JkZXIKLWRlYnVnR3JhcGhpY3NPcHRpb25zCi1kb3VibGVCdWZmZXJlZAotZm9jdXNDeWNsZVJvb3QKLWdyYXBoaWNzCi1oZWlnaHQKLWluc2V0cwotbWFuYWdpbmdGb2N1cwotbWF4aW11bVNpemUKLW1pbmltdW1TaXplCi1uZXh0Rm9jdXNhYmxlQ29tcG9uZW50Ci1vcGFxdWUKLW9wdGltaXplZERyYXdpbmdFbmFibGVkCi1wYWludGluZ1RpbGUKLXByZWZlcnJlZFNpemUKLXJlZ2lzdGVyZWRLZXlTdHJva2VzCi1yZXF1ZXN0Rm9jdXNFbmFibGVkCi1yb290UGFuZQotdG9vbFRpcFRleHQKLXRvcExldmVsQW5jZXN0b3IKLXZhbGlkYXRlUm9vdAotdmlzaWJsZVJlY3QKLXdpZHRoCi14Ci15Ci1kaXNhYmxlZEljb24KLWRpc3BsYXllZE1uZW1vbmljCi1mb250Ci1ob3Jpem9udGFsQWxpZ25tZW50Ci1ob3Jpem9udGFsVGV4dFBvc2l0aW9uCi1pY29uCi1pY29uVGV4dEdhcAotbGFiZWxGb3IKLXRleHQKLXZlcnRpY2FsQWxpZ25tZW50Ci12ZXJ0aWNhbFRleHRQb3NpdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL292ZXJyaWRlcy9iZWFuaW5mby9UZXN0T3ZlcnJpZGVzLm92ZXJyaWRlIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL292ZXJyaWRlcy9iZWFuaW5mby9UZXN0T3ZlcnJpZGVzLm92ZXJyaWRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDllYmU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9vdmVycmlkZXMvYmVhbmluZm8vVGVzdE92ZXJyaWRlcy5vdmVycmlkZQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hhbmdlOkNoYW5nZURlc2NyaXB0aW9uIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5qZW0uamF2YT0iamF2YS54bWkiIHhtbG5zOm9yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkZS5kZWNvcmF0b3JzPSJodHRwOi8vL29yZy9lY2xpcHNlL3ZlL2ludGVybmFsL2NkZS9kZWNvcmF0b3JzLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGUudXRpbGl0eT0iaHR0cDovLy9vcmcvZWNsaXBzZS92ZS9pbnRlcm5hbC9jZGUvdXRpbGl0eS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtPSJodHRwOi8vL29yZy9lY2xpcHNlL3ZlL2ludGVybmFsL2pjbS5lY29yZSIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpjaGFuZ2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvQ2hhbmdlIiB4bWk6dmVyc2lvbj0iMi4wIj4KLSAgIDxvYmplY3RDaGFuZ2VzIGtleT0iWDpST09UIy8vQHJvb3QiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9Il9lU3RydWN0dXJhbEZlYXR1cmVzIF9lU3RydWN0dXJhbEZlYXR1cmVzMSIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggeG1pOmlkPSJfZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Inh5eiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iT3ZlcnJpZGUgQW5ub3RhdGlvbiIvPgotICAgIDwvb2JqZWN0c1RvQXR0YWNoPgotICAgPG9iamVjdHNUb0F0dGFjaCB4bWk6aWQ9Il9lU3RydWN0dXJhbEZlYXR1cmVzMSIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlc3Q3OTA4MyIvPiAgICAKLTwvY2hhbmdlOkNoYW5nZURlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YmFzaWMuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RiYXNpYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZTc2MDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RiYXNpYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJlYW5pbmZvLnppcCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YmVhbmluZm8uemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjcwYWJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YmVhbmluZm8uemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RiZWFuaW5mb2JlYW5pbmZvcy56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJlYW5pbmZvYmVhbmluZm9zLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2OWMxYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJlYW5pbmZvYmVhbmluZm9zLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YmVhbmluZm9wcmVxLnppcCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YmVhbmluZm9wcmVxLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEzZThhZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJlYW5pbmZvcHJlcS56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJ1dHRvbmJlYW5pbmZvdWkxcHJvamVjdGphci56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJ1dHRvbmJlYW5pbmZvdWkxcHJvamVjdGphci56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMmI1ODcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RidXR0b25iZWFuaW5mb3VpMXByb2plY3RqYXIuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RyZW1vdGVwcm9qZWN0LnppcCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0cmVtb3RlcHJvamVjdC56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjMwMjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RyZW1vdGVwcm9qZWN0LnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS91bnppcC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdW56aXAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDk3YTc1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS91bnppcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9InppcCIgZGVmYXVsdD0iemlwIiBiYXNlZGlyPSIuIj4KLSAgPHRhcmdldCBuYW1lPSJ6aXAiPgotICAgIDx1bnppcCBzcmM9IiR7emlwZnJvbX0iIGRlc3Q9IiR7emlwdG99IiAvPiAgCi0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy92bV90ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvdm0vVGVzdENhbGxiYWNrLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3ZtL1Rlc3RDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjIxOGRiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy92bV90ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvdm0vVGVzdENhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS52bTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RDYWxsYmFjay5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uKjsKLS8qKgotICogVGhpcyBpcyBhIHRlc3QgZm9yIHRlc3RpbmcgY2FsbGJhY2tzLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdENhbGxiYWNrIGltcGxlbWVudHMgSUNhbGxiYWNrIHsKLQkKLQlJVk1DYWxsYmFja1NlcnZlciB2bVNlcnZlcjsKLQlpbnQgY2FsbGJhY2tJRDsKLQlib29sZWFuIHN0b3AgPSBmYWxzZTsKLQotCS8qKgotCSAqIFdoZW4gdG9sZCB0byBzdGFydCwgaXQgd2lsbCBzZW5kIGEgY2FsbGJhY2sKLQkgKiBvbmNlIGV2ZXJ5IGhhbGYgc2Vjb25kIHVudGlsIHRvbGQgdG8gc3RvcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gRmlyc3Qgc2VuZCBiYWNrIHRlc3QgZm9yIElERSBjYWxsaW5nIGJhY2sgb24gc2FtZSB0aHJlYWQuIFdlIGRvIHRoaXMgYnkgc2VuZGluZyB0aGUgdGhyZWFkIGlkCi0JCQkJLy8gYXMgYSBjb25zdGFudCBhbmQgdGhlIG90aGVyIHNpZGUgd2lsbCB0aGVuIGNhbGwgYmFjayB0byByZW1vdGUsIGFzayBmb3IgdGhlIHRocmVhZCBpZCwgYW5kCi0JCQkJLy8gc2VlIGlmIGl0IG1hdGNoZXMuCi0JCQkJdHJ5IHsKLQkJCQkJdm1TZXJ2ZXIuZG9DYWxsYmFjayhuZXcgSUNhbGxiYWNrUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgT2JqZWN0IHJ1bihJQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJCQkJCQlyZXR1cm4gaGFuZGxlci5jYWxsYmFja0FzQ29uc3RhbnRzKGNhbGxiYWNrSUQsIDEsIG5ldyBJbnRlZ2VyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaGFzaENvZGUoKSkpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJCi0JCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCQotCQkJCS8vIE5vdyBkbyB0aGUgcmVndWxhciB0ZXN0aW5nLgotCQkJCWZpbmFsIEludGVnZXJbXSBwID0gbmV3IEludGVnZXJbXSB7bmV3IEludGVnZXIoMCl9OwotCQkJCXdoaWxlKCFzdG9wKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJaWYgKHN0b3ApCi0JCQkJCQlicmVhazsKLQkJCQkJLy8gTm93IHNpZ25hbCB0aGUgY2FsbGJhY2suCi0JCQkJCXBbMF0gPSBuZXcgSW50ZWdlcihwWzBdLmludFZhbHVlKCkrMSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl2bVNlcnZlci5kb0NhbGxiYWNrKG5ldyBJQ2FsbGJhY2tSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgT2JqZWN0IHJ1bihJQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJCQkJCQkJcmV0dXJuIGhhbmRsZXIuY2FsbGJhY2tXaXRoUGFybXMoY2FsbGJhY2tJRCwgMCwgcCk7CQkJCQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0JCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0pLnN0YXJ0KCk7Ci0JfQotCQotCS8qKgotCSAqIFRlbGwgaXQgc3RvcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlzdG9wID0gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogSXQgaXMgYmVpbmcgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUNhbGxiYWNrKElWTUNhbGxiYWNrU2VydmVyIHNlcnZlciwgaW50IGlkKSB7Ci0JCXZtU2VydmVyID0gc2VydmVyOwotCQljYWxsYmFja0lEID0gaWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3ZtL1Rlc3RDYWxsYmFja1N0cmVhbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS92bS9UZXN0Q2FsbGJhY2tTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4M2ViNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3ZtL1Rlc3RDYWxsYmFja1N0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkudm07Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0Q2FsbGJhY2tTdHJlYW0uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JVk1DYWxsYmFja1NlcnZlcjsKLS8qKgotICogVGhpcyBpcyBhIHRlc3QgZm9yIHRlc3RpbmcgY2FsbGJhY2sgc3RyZWFtcy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RDYWxsYmFja1N0cmVhbSBpbXBsZW1lbnRzIElDYWxsYmFjayB7Ci0JCi0JSVZNQ2FsbGJhY2tTZXJ2ZXIgdm1TZXJ2ZXI7Ci0JaW50IGNhbGxiYWNrSUQ7Ci0JYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBXaGVuIHRvbGQgdG8gc3RhcnQsIGl0IHdpbGwgc2VuZCBhIHN0cmVhbSBvZiAzMDAwMCBieXRlcyBvZiBpbmNyZW1lbnRpbmcKLQkgKiB2YWx1ZSAoaS5lLiAwLCAxLCAyLCAuLi4sIDEyNywgLTEyNywgLi4uKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQluZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlPdXRwdXRTdHJlYW0gb3MgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW9zID0gdm1TZXJ2ZXIucmVxdWVzdFN0cmVhbShjYWxsYmFja0lELCAwKTsKLQkJCQkJaWYgKG9zICE9IG51bGwpCi0JCQkJCQlmb3IgKGludCBpPTA7IGk8MzAwMDA7IGkrKykKLQkJCQkJCQlvcy53cml0ZShpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlpZiAob3MgIT0gbnVsbCkKLQkJCQkJCW9zLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJfX0pLnN0YXJ0KCk7Ci0JfQotCQotCS8qKgotCSAqIEl0IGlzIGJlaW5nIGluaXRpYWxpemVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDYWxsYmFjayhJVk1DYWxsYmFja1NlcnZlciBzZXJ2ZXIsIGludCBpZCkgewotCQl2bVNlcnZlciA9IHNlcnZlcjsKLQkJY2FsbGJhY2tJRCA9IGlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS92bS9UZXN0RXhwcmVzc2lvblRocmVhZFRyYW5zZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3ZtL1Rlc3RFeHByZXNzaW9uVGhyZWFkVHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1YjVhZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3ZtL1Rlc3RFeHByZXNzaW9uVGhyZWFkVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LnZtOwotLyoKLSAqICAkUkNTZmlsZTogVGVzdEV4cHJlc3Npb25UaHJlYWRUcmFuc2Zlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uKjsKLS8qKgotICogVGhpcyBpcyBhIHRlc3QgZm9yIHRlc3RpbmcgY2FsbGJhY2tzLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEV4cHJlc3Npb25UaHJlYWRUcmFuc2ZlciBpbXBsZW1lbnRzIElDYWxsYmFjayB7Ci0JCi0JSVZNQ2FsbGJhY2tTZXJ2ZXIgdm1TZXJ2ZXI7Ci0JaW50IGNhbGxiYWNrSUQ7Ci0JYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBXaGVuIHRvbGQgdG8gc3RhcnQsIGl0IHdpbGwgc2VuZCBhIGNhbGxiYWNrCi0JICogb25jZSBldmVyeSBoYWxmIHNlY29uZCB1bnRpbCB0b2xkIHRvIHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCS8vIE5lZWQgdG8gcHV0IGl0IGludG8gYSBuZXcgdGhyZWFkLgotCQkvLyBUaGVuIHdlJ2xsIGp1c3Qgd2FpdCB1bnRpbCB0aGUgdGhyZWFkIGlzIGRvbmUuCi0JCS8vIFRoaXMgd2lsbCBjYXVzZSBjYWxsYmFjayBvbnRvIGEgZGlmZmVyZW50IHRocmVhZCBpbiBJREUuCi0JCVRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gQ2FsYmFjayB0byBJREUgb24gdGhpcyB0aHJlYWQuIEl0IHdvbid0IHJldHVybiB1bnRpbCBjb21wbGV0ZSBvbiB0aGUgb3RoZXIgc2lkZS4KLQkJCQl0cnkgewotCQkJCQl2bVNlcnZlci5kb0NhbGxiYWNrKG5ldyBJQ2FsbGJhY2tSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyBPYmplY3QgcnVuKElDYWxsYmFja0hhbmRsZXIgaGFuZGxlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQkJCQkJCXJldHVybiBoYW5kbGVyLmNhbGxiYWNrQXNDb25zdGFudHMoY2FsbGJhY2tJRCwgMCwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQkKLQkJCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl0LnN0YXJ0KCk7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQl0cnkgewotCQkJCXQuam9pbigpOwotCQkJCWJyZWFrOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCS8vIE5vdyB3ZSByZXR1cm4gYW5kIG9yaWdpbmFsIHRocmVhZCBvbiBJREUgcmVzdW1lcyBwcm9jZXNzaW5nLgotCX0KLQkJCi0JLyoqCi0JICogSXQgaXMgYmVpbmcgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUNhbGxiYWNrKElWTUNhbGxiYWNrU2VydmVyIHNlcnZlciwgaW50IGlkKSB7Ci0JCXZtU2VydmVyID0gc2VydmVyOwotCQljYWxsYmFja0lEID0gaWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvdGVzdFBhY2thZ2UvVGVzdEFjY2Vzcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL3Rlc3RQYWNrYWdlL1Rlc3RBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwYmQ2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvdGVzdFBhY2thZ2UvVGVzdEFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RBY2Nlc3MuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wNS8xMSAxOTowMTozMiAkIAotICovCi1wYWNrYWdlIHRlc3RQYWNrYWdlOwotIAotCi0vKioKLSAqIFVzZWQgZm9yIHRlc3RpbmcgZmllbGRzLgotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QWNjZXNzIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Vm9pZCgpIHsKLQkJCi0JfQotCQotCXB1YmxpYyBpbnQgZmllbGQxOwotCXByb3RlY3RlZCBpbnQgZmllbGQyOwotCQotCXB1YmxpYyBzdGF0aWMgaW50IFNUQVRJQ19GSUVMRCA9IDM7Ci0KLQlUZXN0QWNjZXNzKFJ1bnRpbWVFeGNlcHRpb24gaSkgewotCQkKLQl9Ci0JCi0JVGVzdEFjY2VzcyhUaHJvd2FibGUgbikgewotCQkKLQl9Ci0JCi0JcHVibGljIFRlc3RBY2Nlc3MoKSB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgVGVzdEFjY2VzcyhFeGNlcHRpb24gbykgewotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGRkKEludGVnZXIgbywgTnVtYmVyIG4pIHsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGRkZChOdW1iZXIgbywgSW50ZWdlciBuKSB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZGQoTnVtYmVyIG4sIE51bWJlciBuMSkgewotCQkKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB4eXooKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHh5eihOdW1iZXIgbikgewotCX0KLQkKLQlwdWJsaWMgdm9pZCB4eXooT2JqZWN0IG4pIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcXhyKCkgewotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvdGVzdFBhY2thZ2UvVGVzdEN0b3JXaXRoTnVsbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL3Rlc3RQYWNrYWdlL1Rlc3RDdG9yV2l0aE51bGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkZjVjMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvdGVzdFBhY2thZ2UvVGVzdEN0b3JXaXRoTnVsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0UGFja2FnZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RDdG9yV2l0aE51bGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NSAkIAotICovCi0KLS8qKgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDdG9yV2l0aE51bGwgewotCi0JcHVibGljIFRlc3RDdG9yV2l0aE51bGwoU3RyaW5nIHgpIHsKLQkJLy8gVGhpcyBpcyBqdXN0IGEgdGVzdCB0byBzZWUgdGhhdCBjdG9yIHdpbGwgYmUgc2VsZWN0ZWQgaWYgaXQgaGFzIGEgbnVsbCBwYXNzZWQgaW4gZm9yIFRyZWUgRXhwcmVzc2lvbiBQcm9jZXNzaW5nLgotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4NmVlMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotY29yZS1wZXJmb3JtYW5jZS5qYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2UxMmZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhOTBkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS5jb3JlLXBlcmZvcm1hbmNlLmphciA9IHNyYy8KLW91dHB1dC5jb3JlLXBlcmZvcm1hbmNlLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgY29yZS1wZXJmb3JtYW5jZS5qYXIsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgdGVzdGNhc2UueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdmZDUxMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UiCi0gICBuYW1lPSJDb3JlIFBlcmZvcm1hbmNlIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLkNvcmVQZXJmb3JtYW5jZVRlc3RQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImNvcmUtcGVyZm9ybWFuY2UuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvcGVyZm9ybWFuY2UvQWxsQ29yZVBlcmZvcm1hbmNlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvcGVyZm9ybWFuY2UvQWxsQ29yZVBlcmZvcm1hbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkNDIzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL3BlcmZvcm1hbmNlL0FsbENvcmVQZXJmb3JtYW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjgsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5BcHBDbGllbnRFTUZFZGl0VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkFwcENsaWVudEVNRlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FYXJFTUZFZGl0VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVhckVNRlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FamJFTUZFZGl0VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLlJhckVNRkVkaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuUmFyRU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLldhckVNRkVkaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuV2FyRU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLldlYlNlcnZpY2VzRU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS5CYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5hcHBjbGllbnQub3BlcmF0aW9ucy5BcHBDbGllbnRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmVqYi5vcGVyYXRpb25zLkVKQkltcG9ydE9wZXJhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuZWpiLm9wZXJhdGlvbnMuRUpCUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qY2Eub3BlcmF0aW9ucy5KQ0FQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLndlYi5vcGVyYXRpb25zLldlYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3Q7Ci0KLS8qKgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEFsbENvcmVQZXJmb3JtYW5jZVRlc3RzIGV4dGVuZHMgQmFzZVBlcmZvcm1hbmNlVGVzdENhc2V7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJQZXJmb3JtYW5jZSBUZXN0IGZvciBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QiKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgQXBwQ2xpZW50RU1GRWRpdFRlc3QoInRlc3RBcHBsaWNhdGlvbkNsaWVudEVkaXQiKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiQXBwbGljYXRpb24gQ2xpZW50IGVtZiBlZGl0IHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEFwcENsaWVudEVNRlRlc3QoInRlc3RBcHBsaWNhdGlvbkNsaWVudFBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTE9DQUwsICJBcHBsaWNhdGlvbiBDbGllbnQgZW1mIHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEFwcENsaWVudEVNRlRlc3QoInRlc3QxNEFwcGxpY2F0aW9uQ2xpZW50UG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJBcHBsaWNhdGlvbiBDbGllbnQgMTQgZW1mIHRlc3QiICk7Ci0JCQotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBFYXJFTUZFZGl0VGVzdCgidGVzdEVBUkVkaXQiKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiRUFSIGVtZiBlZGl0IHRlc3QiICk7Ci0JCS8vYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgRWFyRU1GVGVzdCgidGVzdEVBUlBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTE9DQUwsICJFQVIgIGVtZiB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBFYXJFTUZUZXN0KCJ0ZXN0MTRFQVJQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIkVBUiAxNCBlbWYgdGVzdCIgKTsKLQkJCi0JCS8vYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgRWpiRU1GRWRpdFRlc3QoInRlc3RFSkJKYXJFZGl0IiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIkVKQiBlbWYgZWRpdCB0ZXN0IC10ZXN0RUpCSmFyRWRpdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgRWpiRU1GRWRpdFRlc3QoInRlc3RXQ0NNSmFyIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkxPQ0FMLCAiRUpCIGVtZiBlZGl0IHRlc3QgLSB0ZXN0V0NDTUphciIgKTsKLQkJLy9hZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBFamJFTUZUZXN0KCJ0ZXN0RUpCSmFyUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTCwgIkVKQiAgZW1mIHRlc3QiICk7Ci0JCS8vYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgRWpiRU1GVGVzdCgidGVzdDE0RUpCSmFyUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJFSkIgMTQgZW1mIHRlc3QiICk7Ci0JCi0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFJhckVNRkVkaXRUZXN0KCJ0ZXN0UkFSRWRpdCIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJSQVIgZW1mIGVkaXQgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgUmFyRU1GVGVzdCgidGVzdFJBUlBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTE9DQUwsICJSQVIgIGVtZiB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBSYXJFTUZUZXN0KCJ0ZXN0MTRSQVJQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIlJBUiAxNCBlbWYgdGVzdCIgKTsKLQkKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgV2FyRU1GRWRpdFRlc3QoInRlc3RXQVJFZGl0IiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIldBUiBlbWYgZWRpdCB0ZXN0IiApOwotCQkvL2FkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFdhckVNRlRlc3QoInRlc3RXQVJQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkxPQ0FMLCAiV0FSICBlbWYgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgV2FyRU1GVGVzdCgidGVzdDE0V0FSUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJXQVIgMTQgZW1mIHRlc3QiICk7Ci0JCQotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBXZWJTZXJ2aWNlc0VNRlRlc3QoInRlc3QxM1dlYlNlcnZpY2VzQ2xpZW50UG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5OT05FLCAiV2ViIFNlcnZpY2UgQ2xpZW50IDEzIGVtZiB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBXZWJTZXJ2aWNlc0VNRlRlc3QoInRlc3QxM1dlYlNlcnZpY2VzRERQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkxPQ0FMLCAiV2ViIHNlcnZpY2VzIDEzIGVtZiB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBXZWJTZXJ2aWNlc0VNRlRlc3QoInRlc3QxNFdlYlNlcnZpY2VzRERQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIldlYiBzZXJ2aWNlcyAxNCBlbWYgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0SmF4UlBDTWFwUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJKYXhSUENNYXBwaW5nIGVtZiB0ZXN0IiApOwotCQkKLQkJCi0JCS8vQ3JlYXRpb24gdGVzdHMKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgRUpCUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCgidGVzdEVKQjIxX0RlZmF1bHRzIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLk5PTkUsICJFSkIgQ29tcG9uZW50IGNyZWF0aW9uIHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEFwcENsaWVudFByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QoInRlc3RBQzUwX0RlZmF1bHRzIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkxPQ0FMLCAiQXBwIENsaWVudCBDb21wb25lbnQgY3JlYXRpb24gdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgSkNBUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCgidGVzdENvbm5lY3RvcjE1X0RlZmF1bHRzIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIkNvbm5lY3RvciBDb21wb25lbnQgY3JlYXRpb24gdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgV2ViUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCgidGVzdFdlYjI0X0RlZmF1bHRzIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIldlYiBDb21wb25lbnQgY3JlYXRpb24gdGVzdCIgKTsKLQkJCi0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVKQkltcG9ydE9wZXJhdGlvblRlc3QoInRlc3RFSkJJbXBvcnQyMV9EZWZhdWx0cyIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5OT05FLCAiRUpCIENvbXBvbmVudCBpbXBvcnQgdGVzdCIgKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9wZXJmb3JtYW5jZS9Db3JlUGVyZm9ybWFuY2VUZXN0UGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL3BlcmZvcm1hbmNlL0NvcmVQZXJmb3JtYW5jZVRlc3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg3NjllYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL3BlcmZvcm1hbmNlL0NvcmVQZXJmb3JtYW5jZVRlc3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb3JlUGVyZm9ybWFuY2VUZXN0UGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVBsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzY2ZkNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9IkoyRUUgUGVyZm9ybWFuY2UgdGVzdCIgZGVmYXVsdD0icGVyZm9ybWFuY2UiIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIvPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIKLSAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwZXJmLXRlc3RzLWZpbGUiCi0gICAgICAgICAgICB2YWx1ZT0iJHt0ZXN0RGlyfS9wZXJmb3JtYW5jZS10ZXN0cy54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLVhteDUxMk0iLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAKLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSBwZXJmb3JtYW5jZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLTx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2Utc3VpdGUiPgotICA8cHJvcGVydHkgbmFtZT0icGVyZm9ybWFuY2UtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BlcmZvcm1hbmNlX2ZvbGRlciIvPgotICA8ZGVsZXRlIGRpcj0iJHtwZXJmb3JtYW5jZS1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke3BlcmYtdGVzdHMtZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtwZXJmb3JtYW5jZS1mb2xkZXJ9Ii8+Ci0gICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLkFsbENvcmVQZXJmb3JtYW5jZVRlc3RzIi8+Ci0gICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+Ci0gIDwvYW50PgotPC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgIAotPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSBwZXJmb3JtYW5jZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZSIgZGVwZW5kcz0iaW5pdCxwZXJmb3JtYW5jZS1zdWl0ZSxjbGVhbnVwIj4KLSAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gIDwvYW50PgotPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTcxODY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08dGVzdENhc2VzPgotCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FYXJFTUZFZGl0VGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdEVBUkVkaXQiIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJFQVIgZW1mIGVkaXQiIC8+Ci0JPC90ZXN0Q2FzZT4KLQk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWFyRU1GVGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdDE0RUFSUG9wdWxhdGlvbiIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkVBUiAxNCBlbWYgdGVzdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVqYkVNRkVkaXRUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0RUpCSmFyRWRpdCIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkVKQiBlbWYgZWRpdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVqYkVNRkVkaXRUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0V0NDTUphciIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkVKQiBlbWYgZWRpdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVqYkVNRlRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3RFSkJKYXJQb3B1bGF0aW9uIiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iRUpCIGVtZiB0ZXN0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWpiRU1GVGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdDE0RUpCSmFyUG9wdWxhdGlvbiIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkVKQiAxNCBlbWYgdGVzdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkFwcENsaWVudEVNRkVkaXRUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0QXBwbGljYXRpb25DbGllbnRFZGl0IiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iQXBwbGljYXRpb24gQ2xpZW50IGVtZiBlZGl0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuQXBwQ2xpZW50RU1GVGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdDE0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uIiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iQXBwbGljYXRpb24gQ2xpZW50IDE0IGVtZiB0ZXN0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAkKLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLlJhckVNRkVkaXRUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0UkFSRWRpdCIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkNvbm5lY3RvciBlbWYgZWRpdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJCi0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5SYXJFTUZUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0MTRSQVJQb3B1bGF0aW9uIiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iQ29ubmVjdG9yIDE0IGVtZiB0ZXN0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuV2FyRU1GRWRpdFRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3RXQVJFZGl0IiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iV2ViIGVtZiBlZGl0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuV2FyRU1GVGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdDE0V0FSUG9wdWxhdGlvbiIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IldlYiAxNCBlbWYgdGVzdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJCi0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5XZWJTZXJ2aWNlc0VNRlRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3QxNFdlYlNlcnZpY2VzRERQb3B1bGF0aW9uIiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iV2ViIHNlcnZpY2VzIDE0IGVtZiB0ZXN0IiAvPgotIAk8L3Rlc3RDYXNlPiAKLSAJCi08L3Rlc3RDYXNlcz4KLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOTAwNTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb25BcmNoaXZlVGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb2ZqMmVlVGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2OTk2OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotdGVzdE91dHB1dAotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotdGVzdHMuamFyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkN2FhYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPjwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmFhMTY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotI1RodSBBcHIgMjYgMTM6Mjg6MjQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTE2ZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IEFwciAyNiAxMzoyODoyNCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczOTk2NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjAwLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogdGVzdHMuamFyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi50ZXN0LAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0LAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQudGVzdCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHMsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5hcGkudGVzdCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmFwaSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lbWZsb2FkLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS50ZXN0LAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC50ZXN0LAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLnRlc3QsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi50ZXN0LAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC50ZXN0Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbMy44LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWksCi0gb3JnLmVjbGlwc2UuamVtLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxMGJhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSB0ZXN0cy5qYXIsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgY29tbW9uQXJjaGl2ZVJlc291cmNlcy8sXAotICAgICAgICAgICAgICAgdGVzdERhdGEvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1vdXRwdXQudGVzdHMuamFyID0gYmluLwotamFycy5jb21waWxlLm9yZGVyID0gdGVzdHMuamFyCi1zb3VyY2UudGVzdHMuamFyID0gY29tbW9uQXJjaGl2ZVRlc3RzLyxcCi0gICAgICAgICAgICAgICAgICAgbW9majJlZVRlc3RzLwotYmluLmV4Y2x1ZGVzID0gY29tbW9uQXJjaGl2ZVJlc291cmNlcy8uY3ZzaWdub3JlCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBvdXQueG1pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLyxcCi0gICAgICAgICAgICAgICB0ZXN0RGF0YS8sXAotICAgICAgICAgICAgICAgdGVzdC54bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODJhOTkzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUNPTlRBQ1Q9ZGFuYmVyZ0B1cy5pYm0uY29tCi1Db21wb25lbnRTaG9ydE5hbWU9Y29tLmlibS5ldG9vbHMuajJlZS5jb3JlLnRlc3QKLUNvbXBvbmVudEZ1bGxOYW1lPWNvbS5pYm0uZXRvb2xzLmoyZWUuY29yZS50ZXN0Ci1Db21wb25lbnRDb21wZXRlbmN5PVRFU1RTCi1KYXZhQ29tcGlsZS4xPXNyY2phcgotQnVpbGRWZXJpZmljYXRpb24uMT1kaXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvcGFja2FnZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTFmMzI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJjb20uaWJtLmV0b29scy5qMmVlLmNvcmUudGVzdCIgZGVmYXVsdD0icGFja2FnaW5nUGx1Z2luIiBiYXNlZGlyPSIuLy4uIj4KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFja2FnZURpciIgdmFsdWU9IiIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLmRpcmVjdG9yeSIgIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uaWQiIHZhbHVlPSJjb20uaWJtLmV0b29scy5qMmVlLmNvcmUudGVzdCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLnZlcnNpb24iICB2YWx1ZT0iIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJwYWNrYWdpbmdQbHVnaW4iIGRlcGVuZHM9ImluaXQiPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSIke3BsdWdpbi5pZH0iLz4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7cGFja2FnZURpcn0vcGx1Z2lucy8ke3BsdWdpbi5pZH1fJHtwbHVnaW4udmVyc2lvbn0iPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3BsdWdpbi5kaXJlY3Rvcnl9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJwbHVnaW4ueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0idGVzdC54bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJydW50aW1lL2NvbW1vbkFyY2hpdmVUZXN0cy5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJydW50aW1lL21vZGVsVGVzdHMuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS9qYXZhVGVzdHMuamFyIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvd3NCdWlsZC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkL3dzQnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjUzODg1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvd3NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBwcm9qZWN0IFsKLQk8IUVOVElUWSBiYXNlQnVpbGQgU1lTVEVNICJmaWxlOi4uLy4uL3dzQnVpbGREZWYueG1sIj4KLV0+Ci0KLTxwcm9qZWN0IG5hbWU9ImJ1aWxkUGx1Z2luIiBkZWZhdWx0PSJidWlsZCIgYmFzZWRpcj0iLi8uLiI+Ci0KLTwhLS0gaW5jbHVkZSB0aGUgY29tbW9uIHhtbCBidWlsZCBmaWxlIC0tPgotJmJhc2VCdWlsZDsKLQotPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0icHJlcGFyZSIgaWY9InBsdWdpbi5pZCI+Ci0KLSAgICA8YW50Y2FsbCB0YXJnZXQ9InVuemlwc3JjamFyIj4gPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSJjb21tb25BcmNoaXZlVGVzdHMiLz4gPC9hbnRjYWxsPgotICAgIDxhbnRjYWxsIHRhcmdldD0idW56aXBzcmNqYXIiPiA8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9Im1vZGVsVGVzdHMiLz4gPC9hbnRjYWxsPgotICAgIDxhbnRjYWxsIHRhcmdldD0idW56aXBzcmNqYXIiPiA8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9ImphdmFUZXN0cyIvPiA8L2FudGNhbGw+Ci0KLSAgICA8bWtkaXIgZGlyPSAiJHtwbHVnaW4uYnVpbGQuZGlyZWN0b3J5fS9jb21tb25ibGQiLz4KLSAgICA8amF2YWMgZmFpbG9uZXJyb3I9ImZhbHNlIiBkZXN0ZGlyPSIke3BsdWdpbi5idWlsZC5kaXJlY3Rvcnl9L2NvbW1vbmJsZCIgaW5jbHVkZUFudFJ1bnRpbWU9ImZhbHNlIj4KLSAgICAgICAgPHNyYyBwYXRoPSIke3BsdWdpbi5zcmMuZGlyZWN0b3J5fS9jb21tb25BcmNoaXZlVGVzdHMiLz4KLSAgICAgICAgPHNyYyBwYXRoPSIke3BsdWdpbi5zcmMuZGlyZWN0b3J5fS9tb2RlbFRlc3RzIi8+Ci0gICAgICAgIDxzcmMgcGF0aD0iJHtwbHVnaW4uc3JjLmRpcmVjdG9yeX0vamF2YVRlc3RzIi8+Ci0gICAgICAgIDxib290Y2xhc3NwYXRoIHBhdGg9IiR7Ym9vdGNsYXNzcGF0aH0iLz4KLSAgICAgICAgPGNsYXNzcGF0aCBwYXRoPSIke3BsdWdpbi5jbGFzc3BhdGh9Ii8+Ci0gICAgPC9qYXZhYz4KLQotCTxhbnRjYWxsIHRhcmdldD0iYnVpbGRqYXIiPgotCQk8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9ImNvbW1vbkFyY2hpdmVUZXN0cyIvPgotCQk8cGFyYW0gbmFtZT0iamFyY2xhc3NwYXRoIiB2YWx1ZT0iJHtwbHVnaW4uY2xhc3NwYXRofTske3BsdWdpbi5idWlsZC5kaXJlY3Rvcnl9L2NvbW1vbmJsZCIvPgotCTwvYW50Y2FsbD4KLQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkamFyIj4KLQkJPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSJtb2RlbFRlc3RzIi8+Ci0JCTxwYXJhbSBuYW1lPSJqYXJjbGFzc3BhdGgiIHZhbHVlPSIke3BsdWdpbi5jbGFzc3BhdGh9OyR7cGx1Z2luLmJ1aWxkLmRpcmVjdG9yeX0vY29tbW9uYmxkIi8+Ci0JPC9hbnRjYWxsPgotCTxhbnRjYWxsIHRhcmdldD0iYnVpbGRqYXIiPgotCQk8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9ImphdmFUZXN0cyIvPgotCQk8cGFyYW0gbmFtZT0iamFyY2xhc3NwYXRoIiB2YWx1ZT0iJHtwbHVnaW4uY2xhc3NwYXRofTske3BsdWdpbi5idWlsZC5kaXJlY3Rvcnl9L2NvbW1vbmJsZCIvPgotCTwvYW50Y2FsbD4KLQotPC90YXJnZXQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTc4ZWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbgotdGVzdE91dHB1dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9hcHBsaWNhdGlvbi1jbGllbnQueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLWNsaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OTZlMjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLWNsaWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbi1jbGllbnQgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkIj4KLQotICAgPGFwcGxpY2F0aW9uLWNsaWVudCBpZD0iQXBwbGljYXRpb24tY2xpZW50X0lEIj4KLSAgICAgIDxpY29uPgotICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDwvaWNvbj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZWpiLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPGNhbGxiYWNrLWhhbmRsZXI+amF2YS51dGlsLkhhc2hUYWJsZTwvY2FsbGJhY2staGFuZGxlcj4KLSAgIDwvYXBwbGljYXRpb24tY2xpZW50PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9hcHBsaWNhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTc3NDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYXBwbGljYXRpb24gUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV8zLmR0ZCI+Ci0KLSAgIDxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQiPgotICAgICAgPGljb24+Ci0gICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgPC9pY29uPgotICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8bW9kdWxlPgotICAgICAgICAgPGphdmE+dXJpXzA8L2phdmE+Ci0gICAgICAgICA8YWx0LWRkPmFsdEREXzA8L2FsdC1kZD4KLSAgICAgIDwvbW9kdWxlPgotICAgICAgPG1vZHVsZT4KLSAgICAgICAgIDxlamI+dXJpXzA8L2VqYj4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMDwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8bW9kdWxlPgotICAgICAgICAgPHdlYj4KLSAgICAgICAgICAgIDx3ZWItdXJpPnVyaV8wPC93ZWItdXJpPgotICAgICAgICAgICAgPGNvbnRleHQtcm9vdD5jb250ZXh0Um9vdF8wPC9jb250ZXh0LXJvb3Q+Ci0gICAgICAgICA8L3dlYj4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMDwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8bW9kdWxlPgotICAgICAgICAgPGNvbm5lY3Rvcj51cmlfMDwvY29ubmVjdG9yPgotICAgICAgICAgPGFsdC1kZD5hbHRERF8wPC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxtb2R1bGU+Ci0gICAgICAgICA8amF2YT51cmlfMTwvamF2YT4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMTwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgIDwvYXBwbGljYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvZWpiLWphci54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvZWpiLWphci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOWQ2OGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2VqYi1qYXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMl8wLmR0ZCI+Ci0KLSAgIDxlamItamFyIGlkPSJlamItamFyX0lEIj4KLSAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuTGlzdDwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkxpc3Q8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV82PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV83PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV83PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV84PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzY8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV82PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua182PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzc8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV83PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua183PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV84PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfODwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV85PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV81PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua181PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua182PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua183PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua184PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua185PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV82PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV82PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV84PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV84PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV82PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV83PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxjbXAtdmVyc2lvbj4yLng8L2NtcC12ZXJzaW9uPgotICAgICAgICAgICAgPGFic3RyYWN0LXNjaGVtYS1uYW1lPmFic3RyYWN0U2NoZW1hTmFtZV8wPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzA8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzE8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzI8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzM8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzQ8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxwcmlta2V5LWZpZWxkPm5hbWVfMDwvcHJpbWtleS1maWVsZD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzExPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzExPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzEyPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTQ8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTA8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzEwPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzExPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzExPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzEyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xMjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzEzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTQ8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzExPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzExPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMDwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18wPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPkxvY2FsPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8xPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzI8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzM8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfNDwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgICAgPHNlc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxzZXNzaW9uLXR5cGU+U3RhdGVmdWw8L3Nlc3Npb24tdHlwZT4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkJlYW48L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzE1PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzE2PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTc8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTg8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xODwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xOTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE4PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE5PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L3Nlc3Npb24+Ci0gICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMjwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8yPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnNxbC5EYXRhPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnNxbC5EYXRhPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEuc3FsLkRhdGE8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnNxbC5EYXRhPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEuc3FsLkRhdGE8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzIzPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI0PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzIwPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yMDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzIxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjI8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjM8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI0PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8zPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMzwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8zPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLkludGVnZXI8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI3PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI4PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjk8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjU8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI2PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI3PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yODwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8bWVzc2FnZS1kcml2ZW4+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV82PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+QmVhbjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxtZXNzYWdlLXNlbGVjdG9yPm1lc3NhZ2VTZWxlY3Rvcl8wPC9tZXNzYWdlLXNlbGVjdG9yPgotICAgICAgICAgICAgPGFja25vd2xlZGdlLW1vZGU+QXV0by1hY2tub3dsZWRnZTwvYWNrbm93bGVkZ2UtbW9kZT4KLSAgICAgICAgICAgIDxtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbj4KLSAgICAgICAgICAgICAgIDxkZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvZGVzdGluYXRpb24tdHlwZT4KLSAgICAgICAgICAgICAgIDxzdWJzY3JpcHRpb24tZHVyYWJpbGl0eT5EdXJhYmxlPC9zdWJzY3JpcHRpb24tZHVyYWJpbGl0eT4KLSAgICAgICAgICAgIDwvbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzMwPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzE8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzA8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzE8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzMyPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzMzPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvbWVzc2FnZS1kcml2ZW4+Ci0gICAgICAgICA8c2Vzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzc8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkxpc3Q8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5MaXN0PC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuTGlzdDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5MaXN0PC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8c2Vzc2lvbi10eXBlPlN0YXRlbGVzczwvc2Vzc2lvbi10eXBlPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+Q29udGFpbmVyPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzU8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzY8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zODwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzM5PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM1PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzMwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzMxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzMyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzMzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvc2Vzc2lvbj4KLSAgICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5TdHJpbmc8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5TdHJpbmc8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLlN0cmluZzwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQzPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ0PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQwPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80MDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80MjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDI8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDM8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ0PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV81PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl81PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80OTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80OTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ1PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ2PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDc8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDg8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80ODwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80OTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180OTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ4PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80OTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ5PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180MDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180MTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Mjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Mzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180NDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80ODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80OTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80OTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAgICAgIDxyZWxhdGlvbnNoaXBzPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzA8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8wPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV84PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuQ29sbGVjdGlvbjwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotCQkJICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzk8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5Db2xsZWN0aW9uPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8xPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMzwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8yPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLQkJCSAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMzwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzY8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzc8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfNDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzg8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzk8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0JCQkgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgPC9yZWxhdGlvbnNoaXBzPgotICAgICAgPGFzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQvPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzM8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV83PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV84PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc183PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV85PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc185PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzExPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV82PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzc8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV80PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV82PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzc8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPk5vdFN1cHBvcnRlZDwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlN1cHBvcnRzPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzU8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzY8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzM8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlc05ldzwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV82PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzc8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPk1hbmRhdG9yeTwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8ZXhjbHVkZS1saXN0PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L2V4Y2x1ZGUtbGlzdD4KLSAgICAgIDwvYXNzZW1ibHktZGVzY3JpcHRvcj4KLSAgICAgIDxlamItY2xpZW50LWphcj5lamJDbGllbnRKYXJfMDwvZWpiLWNsaWVudC1qYXI+Ci0gICA8L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvcmEueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL3JhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyYTI2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvcmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgY29ubmVjdG9yIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIENvbm5lY3RvciAxLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzFfMC5kdGQiPgotPGNvbm5lY3Rvcj4KLSAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgPGljb24+Ci0gICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICA8L2ljb24+Ci0gICAgPHZlbmRvci1uYW1lPnZlbmRvck5hbWVfMDwvdmVuZG9yLW5hbWU+Ci0gICAgPHNwZWMtdmVyc2lvbj4xLjA8L3NwZWMtdmVyc2lvbj4KLSAgICA8ZWlzLXR5cGU+ZWlzVHlwZV8wPC9laXMtdHlwZT4KLSAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPGxpY2Vuc2U+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxpY2Vuc2UtcmVxdWlyZWQ+dHJ1ZTwvbGljZW5zZS1yZXF1aXJlZD4KLSAgICA8L2xpY2Vuc2U+Ci0gICAgPHJlc291cmNlYWRhcHRlcj4KLSAgICAgICAgPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz5tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc18wPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0gICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Y29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VfMDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz5jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc18wPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotICAgICAgICA8Y29ubmVjdGlvbi1pbnRlcmZhY2U+Y29ubmVjdGlvbkludGVyZmFjZV8wPC9jb25uZWN0aW9uLWludGVyZmFjZT4KLSAgICAgICAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb25uZWN0aW9uSW1wbENsYXNzXzA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLSAgICAgICAgPHRyYW5zYWN0aW9uLXN1cHBvcnQ+Tm9UcmFuc2FjdGlvbjwvdHJhbnNhY3Rpb24tc3VwcG9ydD4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzA8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8wPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzE8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8yPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMjwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzM8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8zPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfNDwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzQ8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NTwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQ8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWw8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjU8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWw8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxyZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+dHJ1ZTwvcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8wPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMTwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzI8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8zPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fNDwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgPC9yZXNvdXJjZWFkYXB0ZXI+Ci08L2Nvbm5lY3Rvcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC93ZWIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOWY5NTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+Ci08d2ViLWFwcCBpZD0iV2ViQXBwX0lEIj4KLSAgICA8aWNvbj4KLSAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgIDwvaWNvbj4KLSAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgPGRpc3RyaWJ1dGFibGUvPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI8L3BhcmFtLXZhbHVlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80PC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8ZmlsdGVyPgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZmlsdGVyLWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yNTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI1PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI3PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI4PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgPC9maWx0ZXI+Ci0gICAgPGZpbHRlcj4KLSAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8xPC9sYXJnZS1pY29uPgotICAgICAgICA8L2ljb24+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzE8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEudXRpbC5MaXN0PC9maWx0ZXItY2xhc3M+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzMwPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzMxPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zMjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzMzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM0PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICA8L2ZpbHRlcj4KLSAgICA8ZmlsdGVyPgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8yPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzI8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+amF2YS5zcWwuRGF0YTwvZmlsdGVyLWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zNTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM1PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM3PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM4PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgPC9maWx0ZXI+Ci0gICAgPGZpbHRlcj4KLSAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMzwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8zPC9sYXJnZS1pY29uPgotICAgICAgICA8L2ljb24+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzM8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQwPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80MTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQxPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80MjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80NDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ0PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICA8L2ZpbHRlcj4KLSAgICA8ZmlsdGVyPgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfNDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvZmlsdGVyLWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80NTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ1PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80NjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ3PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80ODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ4PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80OTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgPC9maWx0ZXI+Ci0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8wPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMDwvdXJsLXBhdHRlcm4+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzE8L2ZpbHRlci1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xPC91cmwtcGF0dGVybj4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI8L3VybC1wYXR0ZXJuPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8zPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzwvdXJsLXBhdHRlcm4+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80PC91cmwtcGF0dGVybj4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS5zcWwuRGF0YTwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8wPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxqc3AtZmlsZT5qc3BGaWxlXzA8L2pzcC1maWxlPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8wPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MDwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvcnVuLWFzPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzA8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8xPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmNsYXNzTmFtZV8wPC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV81PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzY8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzc8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV83PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV84PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfODwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfOTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzk8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvcnVuLWFzPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzU8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua182PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNzwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzg8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua185PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8yPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzI8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8yPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxqc3AtZmlsZT5qc3BGaWxlXzE8L2pzcC1maWxlPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xMDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzEwPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzEyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xMzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzEzPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xNDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MjwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvcnVuLWFzPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTA8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzExPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMjwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTM8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE0PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8zPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmNsYXNzTmFtZV8xPC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xNTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE1PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE3PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE4PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MzwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvcnVuLWFzPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTU8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE2PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNzwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTg8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE5PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV80PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxqc3AtZmlsZT5qc3BGaWxlXzI8L2pzcC1maWxlPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yMDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzIwPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzIyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yMzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzIzPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yNDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+NDwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvcnVuLWFzPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjA8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIxPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMjwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjM8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI0PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8wPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzE8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8yPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMzwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgPHNlc3Npb24tY29uZmlnPgotICAgICAgICA8c2Vzc2lvbi10aW1lb3V0PjA8L3Nlc3Npb24tdGltZW91dD4KLSAgICA8L3Nlc3Npb24tY29uZmlnPgotICAgIDxtaW1lLW1hcHBpbmc+Ci0gICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzA8L2V4dGVuc2lvbj4KLSAgICAgICAgPG1pbWUtdHlwZT5taW1lVHlwZV8wPC9taW1lLXR5cGU+Ci0gICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgPG1pbWUtbWFwcGluZz4KLSAgICAgICAgPGV4dGVuc2lvbj5leHRlbnNpb25fMTwvZXh0ZW5zaW9uPgotICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzE8L21pbWUtdHlwZT4KLSAgICA8L21pbWUtbWFwcGluZz4KLSAgICA8bWltZS1tYXBwaW5nPgotICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8yPC9leHRlbnNpb24+Ci0gICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMjwvbWltZS10eXBlPgotICAgIDwvbWltZS1tYXBwaW5nPgotICAgIDxtaW1lLW1hcHBpbmc+Ci0gICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzM8L2V4dGVuc2lvbj4KLSAgICAgICAgPG1pbWUtdHlwZT5taW1lVHlwZV8zPC9taW1lLXR5cGU+Ci0gICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgPG1pbWUtbWFwcGluZz4KLSAgICAgICAgPGV4dGVuc2lvbj5leHRlbnNpb25fNDwvZXh0ZW5zaW9uPgotICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzQ8L21pbWUtdHlwZT4KLSAgICA8L21pbWUtbWFwcGluZz4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfMDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzE8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT53ZWxjb21lRmlsZV8yPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfMzwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzQ8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotICAgIDxlcnJvci1wYWdlPgotICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvZXhjZXB0aW9uLXR5cGU+Ci0gICAgICAgIDxsb2NhdGlvbj5sb2NhdGlvbl8wPC9sb2NhdGlvbj4KLSAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgPGVycm9yLXBhZ2U+Ci0gICAgICAgIDxlcnJvci1jb2RlPmVycm9yQ29kZV8wPC9lcnJvci1jb2RlPgotICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMDwvbG9jYXRpb24+Ci0gICAgPC9lcnJvci1wYWdlPgotICAgIDxlcnJvci1wYWdlPgotICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS51dGlsLkxpc3Q8L2V4Y2VwdGlvbi10eXBlPgotICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMTwvbG9jYXRpb24+Ci0gICAgPC9lcnJvci1wYWdlPgotICAgIDxlcnJvci1wYWdlPgotICAgICAgICA8ZXJyb3ItY29kZT5lcnJvckNvZGVfMTwvZXJyb3ItY29kZT4KLSAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzE8L2xvY2F0aW9uPgotICAgIDwvZXJyb3ItcGFnZT4KLSAgICA8ZXJyb3ItcGFnZT4KLSAgICAgICAgPGV4Y2VwdGlvbi10eXBlPmphdmEuc3FsLkRhdGE8L2V4Y2VwdGlvbi10eXBlPgotICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMjwvbG9jYXRpb24+Ci0gICAgPC9lcnJvci1wYWdlPgotICAgIDx0YWdsaWI+Ci0gICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8wPC90YWdsaWItdXJpPgotICAgICAgICA8dGFnbGliLWxvY2F0aW9uPnRhZ2xpYkxvY2F0aW9uXzA8L3RhZ2xpYi1sb2NhdGlvbj4KLSAgICA8L3RhZ2xpYj4KLSAgICA8dGFnbGliPgotICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMTwvdGFnbGliLXVyaT4KLSAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8xPC90YWdsaWItbG9jYXRpb24+Ci0gICAgPC90YWdsaWI+Ci0gICAgPHRhZ2xpYj4KLSAgICAgICAgPHRhZ2xpYi11cmk+dGFnbGliVVJJXzI8L3RhZ2xpYi11cmk+Ci0gICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMjwvdGFnbGliLWxvY2F0aW9uPgotICAgIDwvdGFnbGliPgotICAgIDx0YWdsaWI+Ci0gICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8zPC90YWdsaWItdXJpPgotICAgICAgICA8dGFnbGliLWxvY2F0aW9uPnRhZ2xpYkxvY2F0aW9uXzM8L3RhZ2xpYi1sb2NhdGlvbj4KLSAgICA8L3RhZ2xpYj4KLSAgICA8dGFnbGliPgotICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfNDwvdGFnbGliLXVyaT4KLSAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl80PC90YWdsaWItbG9jYXRpb24+Ci0gICAgPC90YWdsaWI+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzE8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8c2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8wPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+QUNMPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5CQVNFTElORS1DT05UUk9MPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5CSU5EPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5DSEVDS0lOPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5DSEVDS09VVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TEFCRUw8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1FUkdFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5NS0FDVElWSVRZPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8zPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5NS1dPUktTUEFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UkVCSU5EPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5SRVBPUlQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlNFQVJDSDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VU5CSU5EPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV80PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzIwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzIxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzIyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzIzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5VTkNIRUNLT1VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5VUERBVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlZFUlNJT04tQ09OVFJPTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+QUNLPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5CWUU8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8YXV0aC1jb25zdHJhaW50PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgIDx1c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx0cmFuc3BvcnQtZ3VhcmFudGVlPk5PTkU8L3RyYW5zcG9ydC1ndWFyYW50ZWU+Ci0gICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV81PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5DQU5DRUw8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkNPUFk8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkVSUk9SUkVTUE9OU0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPklORk88L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPklOVklURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNjwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TE9DSzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TUVTU0FHRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TUtDT0w8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1PVkU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk5PVElGWTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFJBQ0s8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBST1BGSU5EPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QUk9QUEFUQ0g8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBST1ZJU0lPTkFMUkVTUE9OU0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVQkxJU0g8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzg8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlJFRElSRUNUUkVTUE9OU0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlJFR0lTVEVSPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5SRVFVRVNUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5SRVNQT05TRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+U1VDQ0VTU1JFU1BPTlNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV85PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5VTkxPQ0s8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8YXV0aC1jb25zdHJhaW50PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc181PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc184PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgIDx1c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx0cmFuc3BvcnQtZ3VhcmFudGVlPklOVEVHUkFMPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICA8L3VzZXItZGF0YS1jb25zdHJhaW50PgotICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICA8c2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTA8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzUwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzUxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzUyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzUzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+QUNMPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5CQVNFTElORS1DT05UUk9MPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xMTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkJJTkQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkNIRUNLSU48L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkNIRUNLT1VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5MQUJFTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TUVSR0U8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzEyPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TUtBQ1RJVklUWTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TUtXT1JLU1BBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlJFQklORDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UkVQT1JUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5TRUFSQ0g8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzEzPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VU5CSU5EPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5VTkNIRUNLT1VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5VUERBVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlZFUlNJT04tQ09OVFJPTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+QUNLPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xNDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkJZRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+Q0FOQ0VMPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5DT1BZPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5FUlJPUlJFU1BPTlNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5JTkZPPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPGF1dGgtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTQ8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgIDx1c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx0cmFuc3BvcnQtZ3VhcmFudGVlPkNPTkZJREVOVElBTDwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE1PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SU5WSVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5MT0NLPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5NRVNTQUdFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5NS0NPTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TU9WRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTY8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5OT1RJRlk8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBSQUNLPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QUk9QRklORDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFJPUFBBVENIPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QUk9WSVNJT05BTFJFU1BPTlNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xNzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVQkxJU0g8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlJFRElSRUNUUkVTUE9OU0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlJFR0lTVEVSPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5SRVFVRVNUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5SRVNQT05TRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTg8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzkwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzkxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzkyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzkzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzk0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5TVUNDRVNTUkVTUE9OU0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlVOTE9DSzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE5PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+QUNMPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPGF1dGgtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTk8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgIDx1c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx0cmFuc3BvcnQtZ3VhcmFudGVlPk5PTkU8L3RyYW5zcG9ydC1ndWFyYW50ZWU+Ci0gICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yMDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTAwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTAzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+QkFTRUxJTkUtQ09OVFJPTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+QklORDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+Q0hFQ0tJTjwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+Q0hFQ0tPVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkxBQkVMPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yMTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TUVSR0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1LQUNUSVZJVFk8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1LV09SS1NQQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5SRUJJTkQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlJFUE9SVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjI8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTEyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlNFQVJDSDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VU5CSU5EPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5VTkNIRUNLT1VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5VUERBVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlZFUlNJT04tQ09OVFJPTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjM8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkFDSzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+QllFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5DQU5DRUw8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkNPUFk8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkVSUk9SUkVTUE9OU0U8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzI0PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTIxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTI0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5JTkZPPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5JTlZJVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkxPQ0s8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1FU1NBR0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1LQ09MPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPGF1dGgtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgIDx1c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx0cmFuc3BvcnQtZ3VhcmFudGVlPklOVEVHUkFMPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICA8L3VzZXItZGF0YS1jb25zdHJhaW50PgotICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICA8bG9naW4tY29uZmlnPgotICAgICAgICA8YXV0aC1tZXRob2Q+QkFTSUM8L2F1dGgtbWV0aG9kPgotICAgICAgICA8cmVhbG0tbmFtZT5yZWFsbU5hbWVfMDwvcmVhbG0tbmFtZT4KLSAgICAgICAgPGZvcm0tbG9naW4tY29uZmlnPgotICAgICAgICAgICAgPGZvcm0tbG9naW4tcGFnZT5mb3JtTG9naW5QYWdlXzA8L2Zvcm0tbG9naW4tcGFnZT4KLSAgICAgICAgICAgIDxmb3JtLWVycm9yLXBhZ2U+Zm9ybUVycm9yUGFnZV8wPC9mb3JtLWVycm9yLXBhZ2U+Ci0gICAgICAgIDwvZm9ybS1sb2dpbi1jb25maWc+Ci0gICAgPC9sb2dpbi1jb25maWc+Ci0gICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgPC9zZWN1cml0eS1yb2xlPgotICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgPC9zZWN1cml0eS1yb2xlPgotICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNDwvcm9sZS1uYW1lPgotICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8xPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzQ8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzA8L2xvY2FsLWhvbWU+Ci0gICAgICAgIDxsb2NhbD5yZW1vdGVfMDwvbG9jYWw+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgIDxsb2NhbD5yZW1vdGVfMTwvbG9jYWw+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yPC9sb2NhbC1ob21lPgotICAgICAgICA8bG9jYWw+cmVtb3RlXzI8L2xvY2FsPgotICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zPC9sb2NhbC1ob21lPgotICAgICAgICA8bG9jYWw+cmVtb3RlXzM8L2xvY2FsPgotICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgPGxvY2FsPnJlbW90ZV80PC9sb2NhbD4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgPC9lamItbG9jYWwtcmVmPgotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2FwcGxpY2F0aW9uLWNsaWVudC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvYXBwbGljYXRpb24tY2xpZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1OTYwYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvYXBwbGljYXRpb24tY2xpZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uLWNsaWVudCBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIENsaWVudCAxLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb24tY2xpZW50XzFfMy5kdGQiPgotCi0gICA8YXBwbGljYXRpb24tY2xpZW50IGlkPSJBcHBsaWNhdGlvbi1jbGllbnRfSUQiPgotICAgICAgPGljb24+Ci0gICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgPC9pY29uPgotICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5NzYzMjM5Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3NjMyNDAiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3NjMyNDEiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3NjMyNTkiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc2MzI2MCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5NzYzMjc5Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5NzYzMjgwIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8xPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3NjMyODEiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3NjMyODIiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc2MzI4MyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzQ8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3NjMyOTkiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc2MzMwMCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc2MzMwMSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5NzYzMzAyIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5NzYzMzAzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV80PC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5NzYzMzE5Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5NzYzMzQ5Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc2MzM1MCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc2MzM1MSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3NjMzNTIiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPGNhbGxiYWNrLWhhbmRsZXI+amF2YS51dGlsLkhhc2hUYWJsZTwvY2FsbGJhY2staGFuZGxlcj4KLSAgIDwvYXBwbGljYXRpb24tY2xpZW50PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2FwcGxpY2F0aW9uLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9hcHBsaWNhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjQ2YmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2FwcGxpY2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYXBwbGljYXRpb24gUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV8zLmR0ZCI+Ci0KLSAgIDxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQiPgotICAgICAgPGljb24+Ci0gICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgPC9pY29uPgotICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8bW9kdWxlIGlkPSJKYXZhQ2xpZW50TW9kdWxlXzEwNTE2Mzk3NzgxNjAiPgotICAgICAgICAgPGphdmE+dXJpXzA8L2phdmE+Ci0gICAgICAgICA8YWx0LWRkPmFsdEREXzA8L2FsdC1kZD4KLSAgICAgIDwvbW9kdWxlPgotICAgICAgPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzEwNTE2Mzk3NzgxNjAiPgotICAgICAgICAgPGVqYj51cmlfMTwvZWpiPgotICAgICAgICAgPGFsdC1kZD5hbHRERF8xPC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxtb2R1bGUgaWQ9IldlYk1vZHVsZV8xMDUxNjM5Nzc4MTYwIj4KLSAgICAgICAgIDx3ZWI+Ci0gICAgICAgICAgICA8d2ViLXVyaT51cmlfMjwvd2ViLXVyaT4KLSAgICAgICAgICAgIDxjb250ZXh0LXJvb3Q+Y29udGV4dFJvb3RfMDwvY29udGV4dC1yb290PgotICAgICAgICAgPC93ZWI+Ci0gICAgICAgICA8YWx0LWRkPmFsdEREXzI8L2FsdC1kZD4KLSAgICAgIDwvbW9kdWxlPgotICAgICAgPG1vZHVsZSBpZD0iQ29ubmVjdG9yTW9kdWxlXzEwNTE2Mzk3NzgxNjAiPgotICAgICAgICAgPGNvbm5lY3Rvcj51cmlfMzwvY29ubmVjdG9yPgotICAgICAgICAgPGFsdC1kZD5hbHRERF8zPC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxtb2R1bGUgaWQ9IkphdmFDbGllbnRNb2R1bGVfMTA1MTYzOTc3ODE2MSI+Ci0gICAgICAgICA8amF2YT51cmlfNDwvamF2YT4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfNDwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2Mzk3NzgxNzAiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2Mzk3NzgxOTAiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2Mzk3NzgxOTEiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2Mzk3NzgxOTIiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2Mzk3NzgxOTMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICA8L2FwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2VqYi1qYXIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2VqYi1qYXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODc1ZWFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBlamItamFyIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9lamItamFyXzJfMC5kdGQiPgotCi0gICA8ZWpiLWphciBpZD0iZWpiLWphcl9JRCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICA8ZW50ZXJwcmlzZS1iZWFucz4KLSAgICAgICAgIDxlbnRpdHkgaWQ9IkVudGl0eV8xMDUxNjM5Nzg4NjQ1Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkxpc3Q8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEuc3FsLkRhdGE8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4Njk1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg3MDUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg3MDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg3MDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODcxNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4NzI1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4NzI2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg3MjciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg3MjgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODcyOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4NzQ1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV81PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg3NDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg3NDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODc0OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODc0OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg3NzUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18wPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODc3NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4Nzc3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg3NzgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODc3OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cnVuLWFzIGlkPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5XzEwNTE2Mzk3ODg3NzUiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4Nzg1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg3ODYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg3ODciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODc4OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODc5NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgwNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODA5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgICAgPGVudGl0eSBpZD0iRW50aXR5XzEwNTE2Mzk3ODg4MDUiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8xPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnNxbC5EYXRhPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLlN0cmluZzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkxpc3Q8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODgwNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV81PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV81PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4MTUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV82PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4MTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODE3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV84PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4MTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4ODE1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4MTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTE8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4ODE3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4MTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4ODE5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODgxNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTU8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4MTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODgxNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4MTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xODwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODgxOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODgyNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODI2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV82PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4MjciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua183PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODgyOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODI5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV85PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5IGlkPSJVc2VDYWxsZXJJZGVudGl0eV8xMDUxNjM5Nzg4ODI1Ij48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODgyNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODgyNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4ODI3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV83PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV83PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4ODI4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV84PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV84PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg4MjkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODI1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV81PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODI2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV82PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODI3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV83PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgyOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgyOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8ZW50aXR5IGlkPSJDb250YWluZXJNYW5hZ2VkRW50aXR5XzEwNTE2Mzk3ODg4MjUiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMjwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8yPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLlN0cmluZzwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuTGlzdDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEuc3FsLkRhdGE8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnNxbC5EYXRhPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC12ZXJzaW9uPjIuMDwvY21wLXZlcnNpb24+Ci0gICAgICAgICAgICA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+YWJzdHJhY3RTY2hlbWFOYW1lXzA8L2Fic3RyYWN0LXNjaGVtYS1uYW1lPgotICAgICAgICAgICAgPGNtcC1maWVsZCBpZD0iQ01QQXR0cmlidXRlXzEwNTE2Mzk3ODg4NDUiPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV8zPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkIGlkPSJDTVBBdHRyaWJ1dGVfMTA1MTYzOTc4ODg0NiI+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzQ8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQgaWQ9IkNNUEF0dHJpYnV0ZV8xMDUxNjM5Nzg4ODQ3Ij4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfNTwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZCBpZD0iQ01QQXR0cmlidXRlXzEwNTE2Mzk3ODg4NDgiPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV82PC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkIGlkPSJDTVBBdHRyaWJ1dGVfMTA1MTYzOTc4ODg0OSI+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzc8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4ODUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4ODYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzExPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzExPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4ODciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODg4OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODg4OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODg4NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4ODg2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzIxPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODg4NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4ODg4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzIzPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODg4OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjQ8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4OTUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI1PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODk2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4OTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI3PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODk4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4OTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI5PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4OTUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODg5NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzExPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODk3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4OTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODg5OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cnVuLWFzIGlkPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5XzEwNTE2Mzk3ODg4OTUiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4ODk1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg4OTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg4OTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODg5OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODkwNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODkwNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTA2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTA3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5MDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5MDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cXVlcnkgaWQ9IlF1ZXJ5XzEwNTE2Mzk3ODg5MzYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZCBpZD0iUXVlcnlNZXRob2RfMTA1MTYzOTc4ODkzNiI+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81NTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+UmVtb3RlPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8wPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5IGlkPSJRdWVyeV8xMDUxNjM5Nzg4OTM3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2QgaWQ9IlF1ZXJ5TWV0aG9kXzEwNTE2Mzk3ODg5MzciPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPkxvY2FsPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8xPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5IGlkPSJRdWVyeV8xMDUxNjM5Nzg4OTM4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2QgaWQ9IlF1ZXJ5TWV0aG9kXzEwNTE2Mzk3ODg5MzgiPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMjwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeSBpZD0iUXVlcnlfMTA1MTYzOTc4ODkzOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kIGlkPSJRdWVyeU1ldGhvZF8xMDUxNjM5Nzg4OTM5Ij4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc183MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc183MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5Mb2NhbDwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMzwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeSBpZD0iUXVlcnlfMTA1MTYzOTc4ODk0MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kIGlkPSJRdWVyeU1ldGhvZF8xMDUxNjM5Nzg4OTQwIj4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzQ8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgIDxzZXNzaW9uIGlkPSJTZXNzaW9uXzEwNTE2Mzk3ODg5NDYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8zPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMzwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8zPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnNxbC5EYXRhPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxzZXNzaW9uLXR5cGU+U3RhdGVmdWw8L3Nlc3Npb24tdHlwZT4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkJlYW48L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTQ2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTQ3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk0OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTQ5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg5NTAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODk0NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTQ3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzMxPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODk0OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTQ5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzMzPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODk1MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzQ8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg5NDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM1PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTQ3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg5NDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM3PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTQ5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg5NTAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM5PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk0NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTQ4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk1MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eSBpZD0iVXNlQ2FsbGVySWRlbnRpdHlfMTA1MTYzOTc4ODk0NiI+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk0OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk0OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTU2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk1NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTU4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTU5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NjAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L3Nlc3Npb24+Ci0gICAgICAgICA8ZW50aXR5IGlkPSJFbnRpdHlfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5TdHJpbmc8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5MaXN0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEuc3FsLkRhdGE8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTU2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTU3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg5NTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg5NTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTYwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQwPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODk1NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQyPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODk1OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NjAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ0PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTU2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk1NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ2PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTU4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk1OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ4PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTYwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180OTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTU2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk1OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTU5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NjAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJ1bi1hcyBpZD0iUnVuQXNTcGVjaWZpZWRJZGVudGl0eV8xMDUxNjM5Nzg4OTU2Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk1NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTU4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTU5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NjAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NjEiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NjEiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NjIiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk2MyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk2NCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTY1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0gICAgICA8cmVsYXRpb25zaGlwcyBpZD0iUmVsYXRpb25zaGlwc18xMDUxNjM5Nzg4OTU2Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24gaWQ9IkVKQlJlbGF0aW9uXzEwNTE2Mzk3ODg5OTYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODg5OTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg4OTk2Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkIGlkPSJDTVJGaWVsZF8xMDUxNjM5Nzg4OTk2Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzEwPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODg5OTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzE8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODg5OTciPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODg5OTciPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMTE8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICAgPGVqYi1yZWxhdGlvbiBpZD0iRUpCUmVsYXRpb25fMTA1MTYzOTc4ODk5NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8xPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4ODk5OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4ODk5OCI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4ODk5OCI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8xNTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg4OTk5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV82PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4ODk5OSI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4ODk5OSI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8xNjwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uIGlkPSJFSkJSZWxhdGlvbl8xMDUxNjM5Nzg5MDA2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzI8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg5MDA2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMTA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg5MDA2Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4OTAwNiI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMjA8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4OTAwNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzExPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg5MDA3Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4OTAwNyI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMjE8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICAgPGVqYi1yZWxhdGlvbiBpZD0iRUpCUmVsYXRpb25fMTA1MTYzOTc4OTAwNyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8zPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4OTAwOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzE1PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg5MDA4Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4OTAwOCI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMjU8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4OTAwOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzE2PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4OTAwOSI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODkwMDkiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzI2PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24gaWQ9IkVKQlJlbGF0aW9uXzEwNTE2Mzk3ODkwMDgiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfNDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODkwMTAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8yMDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODkwMTAiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkIGlkPSJDTVJGaWVsZF8xMDUxNjM5Nzg5MDEwIj4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8zMDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg5MDExIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMjE8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODkwMTEiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkIGlkPSJDTVJGaWVsZF8xMDUxNjM5Nzg5MDExIj4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8zMTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICA8L3JlbGF0aW9uc2hpcHM+Ci0gICAgICA8YXNzZW1ibHktZGVzY3JpcHRvciBpZD0iQXNzZW1ibHlEZXNjcmlwdG9yXzEwNTE2Mzk3ODkwMTYiPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzg5MDM2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzg5MDM3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzg5MDQ2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzg5MDQ3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzg5MDQ4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uIGlkPSJNZXRob2RQZXJtaXNzaW9uXzEwNTE2Mzk3ODkwNTYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTA2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEwNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTA4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTExMCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbiBpZD0iTWV0aG9kUGVybWlzc2lvbl8xMDUxNjM5Nzg5MTE2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTExNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTExOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTE5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbiBpZD0iTWV0aG9kUGVybWlzc2lvbl8xMDUxNjM5Nzg5MTE3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyMSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyMiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzExPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjMiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyNCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uIGlkPSJNZXRob2RQZXJtaXNzaW9uXzEwNTE2Mzk3ODkxMjYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTI2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTI3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTI5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTMwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24gaWQ9Ik1ldGhvZFBlcm1pc3Npb25fMTA1MTYzOTc4OTEyNyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMzEiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMzIiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTMzIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMzQiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMzUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24gaWQ9Ik1ldGhvZFRyYW5zYWN0aW9uXzEwNTE2Mzk3ODkxNDYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTQ2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTQ3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE0OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTQ5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTUwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+Tm90U3VwcG9ydGVkPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24gaWQ9Ik1ldGhvZFRyYW5zYWN0aW9uXzEwNTE2Mzk3ODkxNDciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTUxIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTUyIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1MyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTU0Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTU2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+U3VwcG9ydHM8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbiBpZD0iTWV0aG9kVHJhbnNhY3Rpb25fMTA1MTYzOTc4OTE1NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTU5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjEiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlZDwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uIGlkPSJNZXRob2RUcmFuc2FjdGlvbl8xMDUxNjM5Nzg5MTU3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE2MiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE2MyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjQiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE2NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE2NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVzTmV3PC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24gaWQ9Ik1ldGhvZFRyYW5zYWN0aW9uXzEwNTE2Mzk3ODkxNTgiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTY3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTY4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE2OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTcwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80ODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTcxIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+TWFuZGF0b3J5PC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgIDxleGNsdWRlLWxpc3QgaWQ9IkV4Y2x1ZGVMaXN0XzEwNTE2Mzk3ODkxNjYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTcyIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTc2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTc4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTc5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvZXhjbHVkZS1saXN0PgotICAgICAgPC9hc3NlbWJseS1kZXNjcmlwdG9yPgotICAgICAgPGVqYi1jbGllbnQtamFyPmVqYkNsaWVudEphcl8wPC9lamItY2xpZW50LWphcj4KLSAgIDwvZWpiLWphcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyMS0xLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyMS0xLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcwZDJkNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjEtMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvZWpiLWphcl8xXzEuZHRkIj4KLTxlamItamFyIGlkPSJlamItamFyX0lEIj4KLSAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgPGVudGVycHJpc2UtYmVhbnM+Ci0gICAgICAgIDxlbnRpdHkgaWQ9Ik15Q01QIj4KLSAgICAgICAgICAgIDxlamItbmFtZT5NeUNNUDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5jb20uaWJtLnRlc3QuZWpiLk15Q01QSG9tZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDwvcmVtb3RlPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QQmVhbjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmNvbS5pYm0udGVzdC5lamIuTXlDTVBLZXk8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5rMTwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eSBpZD0iTXlDTVAxIj4KLSAgICAgICAgICAgIDxlamItbmFtZT5NeUNNUDE8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDFIb21lPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5jb20uaWJtLnRlc3QuZWpiLk15Q01QMTwvcmVtb3RlPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QMUJlYW48L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QMUtleTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPmsxPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5IGlkPSJNeUNNUDIiPgotICAgICAgICAgICAgPGVqYi1uYW1lPk15Q01QMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5jb20uaWJtLnRlc3QuZWpiLk15Q01QMkhvbWU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmNvbS5pYm0udGVzdC5lamIuTXlDTVAyPC9yZW1vdGU+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5pYm0udGVzdC5lamIuTXlDTVAyQmVhbjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmNvbS5pYm0udGVzdC5lamIuTXlDTVAyS2V5PC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+azE8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8wPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8wPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzI8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5zcWwuRGF0YTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLkludGVnZXI8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5MaXN0PC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5MaXN0PC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV82PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV83PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV85PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV85PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV81PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua181PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV82PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV83PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV81PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV83PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF83PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua183PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV84PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF84PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua184PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua181PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua182PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua183PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua184PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua185PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eS8+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV81PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV82PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV83PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV84PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV83PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV84PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8yPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzI8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5JbnRlZ2VyPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLmxhbmcuU3RyaW5nPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5MaXN0PC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5zcWwuRGF0YTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnNxbC5EYXRhPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzExPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzEwPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzEwPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8xMDwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzExPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzEyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8xMjwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzE0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8xNDwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzExPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzExPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzExPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzM8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzM8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLlN0cmluZzwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5zcWwuRGF0YTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE5PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzE2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8xNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzE4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8xODwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV80PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5MaXN0PC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnNxbC5EYXRhPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIwPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzIwPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8yMDwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzIyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8yMjwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzI0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8yNDwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzU8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl81PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzU8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI5PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzI2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8yNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzI4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8yODwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV82PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNjwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl82PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnNxbC5EYXRhPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLlN0cmluZzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkxpc3Q8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzMwPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzMwPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zMDwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzMyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zMjwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzM0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zNDwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzMwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzMwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzMxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzMxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzMyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzMyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzMzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzMzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV83PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNzwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl83PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLlN0cmluZzwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuTGlzdDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEuc3FsLkRhdGE8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5zcWwuRGF0YTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM3PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM4PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzM1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzM2PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzM3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzM4PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzM5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eS8+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV84PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fODwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl84PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnNxbC5EYXRhPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQwPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQwPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80MDwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80MjwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQ0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80NDwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfOTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzk8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fOTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkxpc3Q8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEuc3FsLkRhdGE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80OTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ1PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ2PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80ODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180ODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80OTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80OTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80OTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQ1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80NjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDY8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQ3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80ODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80ODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDg8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQ5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180OTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5Lz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80ODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80OTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80ODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAgICA8cmVsYXRpb25zaGlwcz4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzA8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8xPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5MaXN0PC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzE8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzI8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8yPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEuc3FsLkRhdGE8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMzwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMzwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8yPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV80PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzU8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzU8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8zPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV82PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNjwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuTGlzdDwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV83PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV83PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEuc3FsLkRhdGE8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfNDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfODwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzg8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfOTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfOTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICA8L3JlbGF0aW9uc2hpcHM+Ci0gICAgPGFzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV81PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNzwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV84PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dW5jaGVja2VkLz4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18wPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc184PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzExPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQvPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzExPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVuY2hlY2tlZC8+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+Tm90U3VwcG9ydGVkPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+U3VwcG9ydHM8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlZDwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlc05ldzwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80ODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+TWFuZGF0b3J5PC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8ZXhjbHVkZS1saXN0PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9leGNsdWRlLWxpc3Q+Ci0gICAgPC9hc3NlbWJseS1kZXNjcmlwdG9yPgotICAgIDxlamItY2xpZW50LWphcj5lamJDbGllbnRKYXJfMDwvZWpiLWNsaWVudC1qYXI+Ci08L2VqYi1qYXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2VqYi1qYXIyLTAueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2VqYi1qYXIyLTAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYThkYzBmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyMi0wLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4NjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBlamItamFyIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9lamItamFyXzJfMC5kdGQiPgotPGVqYi1qYXIgaWQ9ImVqYi1qYXJfSUQiPgotICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLQk8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLQk8ZW50ZXJwcmlzZS1iZWFucz4KLQkJPGVudGl0eSBpZD0iQ01QMSI+Ci0JCQk8ZWpiLW5hbWU+Q01QMTwvZWpiLW5hbWU+Ci0JCQk8bG9jYWwtaG9tZT5lamJzLkNNUDFMb2NhbEhvbWU8L2xvY2FsLWhvbWU+Ci0JCQk8bG9jYWw+ZWpicy5DTVAxTG9jYWw8L2xvY2FsPgotCQkJPGVqYi1jbGFzcz5lamJzLkNNUDFCZWFuPC9lamItY2xhc3M+Ci0JCQk8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0JCQk8cHJpbS1rZXktY2xhc3M+ZWpicy5DTVAxS2V5PC9wcmltLWtleS1jbGFzcz4KLQkJCTxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLQkJCTxjbXAtdmVyc2lvbj4yLng8L2NtcC12ZXJzaW9uPgotCQkJPGFic3RyYWN0LXNjaGVtYS1uYW1lPkNNUDE8L2Fic3RyYWN0LXNjaGVtYS1uYW1lPgotCQkJPGNtcC1maWVsZD4KLQkJCQk8ZmllbGQtbmFtZT5pZDwvZmllbGQtbmFtZT4KLQkJCTwvY21wLWZpZWxkPgotCQk8L2VudGl0eT4KLQkJPGVudGl0eSBpZD0iQ01QMiI+Ci0JCQk8ZWpiLW5hbWU+Q01QMjwvZWpiLW5hbWU+Ci0JCQk8bG9jYWwtaG9tZT5lamJzLkNNUDJMb2NhbEhvbWU8L2xvY2FsLWhvbWU+Ci0JCQk8bG9jYWw+ZWpicy5DTVAyTG9jYWw8L2xvY2FsPgotCQkJPGVqYi1jbGFzcz5lamJzLkNNUDJCZWFuPC9lamItY2xhc3M+Ci0JCQk8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0JCQk8cHJpbS1rZXktY2xhc3M+ZWpicy5DTVAyS2V5PC9wcmltLWtleS1jbGFzcz4KLQkJCTxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLQkJCTxjbXAtdmVyc2lvbj4yLng8L2NtcC12ZXJzaW9uPgotCQkJPGFic3RyYWN0LXNjaGVtYS1uYW1lPkNNUDI8L2Fic3RyYWN0LXNjaGVtYS1uYW1lPgotCQkJPGNtcC1maWVsZD4KLQkJCQk8ZmllbGQtbmFtZT5pZDwvZmllbGQtbmFtZT4KLQkJCTwvY21wLWZpZWxkPgotCQk8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkxpc3Q8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEuc3FsLkRhdGE8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8wPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8wPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5zcWwuRGF0YTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLkludGVnZXI8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5MaXN0PC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5MaXN0PC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV82PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV83PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV85PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV85PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV81PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua181PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV82PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV83PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV81PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzExPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV82PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzEzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua182PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua183PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV81PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV82PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV84PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV85PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV84PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV85PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV81PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV82PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLkludGVnZXI8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5TdHJpbmc8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkxpc3Q8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnNxbC5EYXRhPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5zcWwuRGF0YTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxjbXAtdmVyc2lvbj4yLng8L2NtcC12ZXJzaW9uPgotICAgICAgICAgICAgPGFic3RyYWN0LXNjaGVtYS1uYW1lPmFic3RyYWN0U2NoZW1hTmFtZV8wPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfMTwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV8zPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzQ8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzExPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzExPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzExPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzExPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzEyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzExPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPkxvY2FsPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMDwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8xPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPkxvY2FsPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMjwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzM8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPkxvY2FsPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfNDwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxzZXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnNxbC5EYXRhPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxzZXNzaW9uLXR5cGU+U3RhdGVmdWw8L3Nlc3Npb24tdHlwZT4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkJlYW48L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE1PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE2PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xOTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzMxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzMzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L3Nlc3Npb24+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8yPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzI8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5MaXN0PC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnNxbC5EYXRhPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIwPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8zPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMzwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8zPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuTGlzdDwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5zcWwuRGF0YTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLlN0cmluZzwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI1PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI2PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yOTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzUxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzUzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzU1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxtZXNzYWdlLWRyaXZlbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+QmVhbjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxtZXNzYWdlLXNlbGVjdG9yPm1lc3NhZ2VTZWxlY3Rvcl8wPC9tZXNzYWdlLXNlbGVjdG9yPgotICAgICAgICAgICAgPGFja25vd2xlZGdlLW1vZGU+QXV0by1hY2tub3dsZWRnZTwvYWNrbm93bGVkZ2UtbW9kZT4KLSAgICAgICAgICAgIDxtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbj4KLSAgICAgICAgICAgICAgICA8ZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWU8L2Rlc3RpbmF0aW9uLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5PkR1cmFibGU8L3N1YnNjcmlwdGlvbi1kdXJhYmlsaXR5PgotICAgICAgICAgICAgPC9tZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbj4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzMzPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM0PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzYxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzYzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzY1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzY3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvbWVzc2FnZS1kcml2ZW4+Ci0gICAgICAgIDxzZXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8xPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnNxbC5EYXRhPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxzZXNzaW9uLXR5cGU+U3RhdGVsZXNzPC9zZXNzaW9uLXR5cGU+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5Db250YWluZXI8L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM3PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM4PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzcxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L3Nlc3Npb24+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV80PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5MaXN0PC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnNxbC5EYXRhPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQxPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzg1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzg3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzg5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV81PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl81PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuTGlzdDwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5zcWwuRGF0YTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLlN0cmluZzwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80ODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80ODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80ODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ5PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzkzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzk1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzk3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180ODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80OTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzk5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180OTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80ODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80OTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80ODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotCTwvZW50ZXJwcmlzZS1iZWFucz4KLSAgICA8cmVsYXRpb25zaGlwcz4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8wPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5MaXN0PC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzE8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzE8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5zcWwuRGF0YTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8xPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8yPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzI8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMzwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMzwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzI8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzQ8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzU8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzU8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkxpc3Q8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMzwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV82PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEuc3FsLkRhdGE8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNzwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNzwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV80PC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV84PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzg8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV85PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV85PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgIDwvcmVsYXRpb25zaGlwcz4KLSAgICA8YXNzZW1ibHktZGVzY3JpcHRvcj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQ+PC91bmNoZWNrZWQ+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8wPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV82PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV84PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc183PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV85PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc185PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dW5jaGVja2VkPjwvdW5jaGVja2VkPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzExPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVuY2hlY2tlZD48L3VuY2hlY2tlZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5Ob3RTdXBwb3J0ZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5TdXBwb3J0czwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVkPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVzTmV3PC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5NYW5kYXRvcnk8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxleGNsdWRlLWxpc3Q+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L2V4Y2x1ZGUtbGlzdD4KLSAgICA8L2Fzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgPGVqYi1jbGllbnQtamFyPmVqYkNsaWVudEphcl8wPC9lamItY2xpZW50LWphcj4KLTwvZWpiLWphcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyMi0wc2F4LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyMi0wc2F4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5NzI0Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjItMHNheC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIj4KLTxlamItamFyIGlkPSJlamItamFyX0lEIj4KLSAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgPGVudGVycHJpc2UtYmVhbnM+Ci0gICAgICAgIDxlbnRpdHkgaWQ9IkNNUDEiPgotICAgICAgICAgICAgPGVqYi1uYW1lPkNNUDE8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+ZWpicy5DTVAxTG9jYWxIb21lPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmVqYnMuQ01QMUxvY2FsPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+ZWpicy5DTVAxQmVhbjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmVqYnMuQ01QMUtleTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLSAgICAgICAgICAgIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT5DTVAxPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+aWQ8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHkgaWQ9IkNNUDIiPgotICAgICAgICAgICAgPGVqYi1uYW1lPkNNUDI8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+ZWpicy5DTVAyTG9jYWxIb21lPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmVqYnMuQ01QMkxvY2FsPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+ZWpicy5DTVAyQmVhbjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmVqYnMuQ01QMktleTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLSAgICAgICAgICAgIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT5DTVAyPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+aWQ8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18wPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEuc3FsLkRhdGE8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5JbnRlZ2VyPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV81PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV83PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV81PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV84PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV84PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua184PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV85PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzExPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua181PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua181PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua182PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua183PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua184PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua185PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eS8+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV81PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV82PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV83PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV84PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV83PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV84PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5JbnRlZ2VyPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLmxhbmcuU3RyaW5nPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5MaXN0PC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5zcWwuRGF0YTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEuc3FsLkRhdGE8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLSAgICAgICAgICAgIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT5hYnN0cmFjdFNjaGVtYU5hbWVfMDwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzE8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfMzwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzExPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzEwPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzIxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzIzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzExPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8wPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzE8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8yPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+UmVtb3RlPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMzwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF80PC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPHNlc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5TdHJpbmc8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5MaXN0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEuc3FsLkRhdGE8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHNlc3Npb24tdHlwZT5TdGF0ZWZ1bDwvc2Vzc2lvbi10eXBlPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+QmVhbjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE5PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzMzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5Lz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvc2Vzc2lvbj4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkxpc3Q8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEuc3FsLkRhdGE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIzPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI0PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI5PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzUzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzU3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzU5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5Lz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPG1lc3NhZ2UtZHJpdmVuPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5MaXN0PC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5CZWFuPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPG1lc3NhZ2Utc2VsZWN0b3I+bWVzc2FnZVNlbGVjdG9yXzA8L21lc3NhZ2Utc2VsZWN0b3I+Ci0gICAgICAgICAgICA8YWNrbm93bGVkZ2UtbW9kZT5BdXRvLWFja25vd2xlZGdlPC9hY2tub3dsZWRnZS1tb2RlPgotICAgICAgICAgICAgPG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uPgotICAgICAgICAgICAgICAgIDxkZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvZGVzdGluYXRpb24tdHlwZT4KLSAgICAgICAgICAgICAgICA8c3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk+RHVyYWJsZTwvc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk+Ci0gICAgICAgICAgICA8L21lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzMxPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzMyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzY1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzY3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzY5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9tZXNzYWdlLWRyaXZlbj4KLSAgICAgICAgPHNlc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5TdHJpbmc8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5MaXN0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEuc3FsLkRhdGE8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHNlc3Npb24tdHlwZT5TdGF0ZWxlc3M8L3Nlc3Npb24tdHlwZT4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkNvbnRhaW5lcjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM1PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM2PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zOTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzcxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzczPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzc1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eS8+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvc2Vzc2lvbj4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzQ8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkxpc3Q8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEuc3FsLkRhdGE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQwPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzgxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzgzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzg5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80MDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180MDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80MTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180MTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Mjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Mjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Mzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Mzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80NDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180NDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzU8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl81PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzU8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80ODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80OTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ3PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ4PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180OTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzkxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzk3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzk5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80NTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180NTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Njwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Njwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Nzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Nzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80ODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180ODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80OTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180OTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgPC9lbnRlcnByaXNlLWJlYW5zPgotICAgIDxyZWxhdGlvbnNoaXBzPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8wPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8wPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuTGlzdDwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8xPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEuc3FsLkRhdGE8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMTwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzI8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMzwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMzwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzI8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzQ8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV80PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuTGlzdDwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8zPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV82PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNjwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnNxbC5EYXRhPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzc8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzc8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfNDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfODwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzg8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV85PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV85PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgIDwvcmVsYXRpb25zaGlwcz4KLSAgICA8YXNzZW1ibHktZGVzY3JpcHRvcj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQvPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV83PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVuY2hlY2tlZC8+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dW5jaGVja2VkLz4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5Ob3RTdXBwb3J0ZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5TdXBwb3J0czwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVkPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVzTmV3PC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5NYW5kYXRvcnk8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxleGNsdWRlLWxpc3Q+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L2V4Y2x1ZGUtbGlzdD4KLSAgICA8L2Fzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgPGVqYi1jbGllbnQtamFyPmVqYkNsaWVudEphcl8wPC9lamItY2xpZW50LWphcj4KLTwvZWpiLWphcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9yYS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvcmEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDgxNmFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9yYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBjb25uZWN0b3IgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgQ29ubmVjdG9yIDEuMC8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9jb25uZWN0b3JfMV8wLmR0ZCI+Ci0KLSAgIDxjb25uZWN0b3IgaWQ9IkNvbm5lY3Rvcl9JRCI+Ci0gICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxpY29uPgotICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDwvaWNvbj4KLSAgICAgIDx2ZW5kb3ItbmFtZT52ZW5kb3JOYW1lXzA8L3ZlbmRvci1uYW1lPgotICAgICAgPHNwZWMtdmVyc2lvbj4xLjA8L3NwZWMtdmVyc2lvbj4KLSAgICAgIDxlaXMtdHlwZT5laXNUeXBlXzA8L2Vpcy10eXBlPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8bGljZW5zZS1yZXF1aXJlZD50cnVlPC9saWNlbnNlLXJlcXVpcmVkPgotICAgICAgPC9saWNlbnNlPgotICAgICAgPHJlc291cmNlYWRhcHRlciBpZD0iUmVzb3VyY2VBZGFwdGVyXzEwNTE2Mzk3NjkwODciPgotICAgICAgICAgPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz5tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc18wPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0gICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlXzA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLSAgICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPmNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzXzA8L2Nvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Ci0gICAgICAgICA8Y29ubmVjdGlvbi1pbnRlcmZhY2U+Y29ubmVjdGlvbkludGVyZmFjZV8wPC9jb25uZWN0aW9uLWludGVyZmFjZT4KLSAgICAgICAgIDxjb25uZWN0aW9uLWltcGwtY2xhc3M+Y29ubmVjdGlvbkltcGxDbGFzc18wPC9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ci0gICAgICAgICA8dHJhbnNhY3Rpb24tc3VwcG9ydD5Ob1RyYW5zYWN0aW9uPC90cmFuc2FjdGlvbi1zdXBwb3J0PgotICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBpZD0iQ29uZmlnUHJvcGVydHlfMTA1MTYzOTc2OTEyNyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8wPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzA8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8wPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgIDxjb25maWctcHJvcGVydHkgaWQ9IkNvbmZpZ1Byb3BlcnR5XzEwNTE2Mzk3NjkxMjgiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV8xPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMTwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgICA8Y29uZmlnLXByb3BlcnR5IGlkPSJDb25maWdQcm9wZXJ0eV8xMDUxNjM5NzY5MTI5Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzI8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPnR5cGVfMjwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzI8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBpZD0iQ29uZmlnUHJvcGVydHlfMTA1MTYzOTc2OTEzMCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8zPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzM8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8zPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgIDxjb25maWctcHJvcGVydHkgaWQ9IkNvbmZpZ1Byb3BlcnR5XzEwNTE2Mzk3NjkxMzEiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfNDwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV80PC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfNDwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtIGlkPSJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV8xMDUxNjM5NzY5MTQ3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5jcmVkZW50aWFsSW50ZXJmYWNlXzA8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtIGlkPSJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV8xMDUxNjM5NzY5MTQ4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjU8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfMTwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gaWQ9IkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtXzEwNTE2Mzk3NjkxNDkiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQ8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfMjwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gaWQ9IkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtXzEwNTE2Mzk3NjkxNTAiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NTwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV8zPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBpZD0iQXV0aGVudGljYXRpb25NZWNoYW5pc21fMTA1MTYzOTc2OTE1MSI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV80PC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgPHJlYXV0aGVudGljYXRpb24tc3VwcG9ydD50cnVlPC9yZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+Ci0gICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbiBpZD0iU2VjdXJpdHlQZXJtaXNzaW9uXzEwNTE2Mzk3NjkxNjciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzA8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uIGlkPSJTZWN1cml0eVBlcm1pc3Npb25fMTA1MTYzOTc2OTE3NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMTwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24gaWQ9IlNlY3VyaXR5UGVybWlzc2lvbl8xMDUxNjM5NzY5MTc4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8yPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbiBpZD0iU2VjdXJpdHlQZXJtaXNzaW9uXzEwNTE2Mzk3NjkxNzkiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzM8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uIGlkPSJTZWN1cml0eVBlcm1pc3Npb25fMTA1MTYzOTc2OTE4MCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fNDwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgPC9yZXNvdXJjZWFkYXB0ZXI+Ci0gICA8L2Nvbm5lY3Rvcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy93ZWIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ODMxYjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+Ci0KLSAgIDx3ZWItYXBwIGlkPSJXZWJBcHBfSUQiPgotICAgICAgPGljb24+Ci0gICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgPC9pY29uPgotICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZGlzdHJpYnV0YWJsZT48L2Rpc3RyaWJ1dGFibGU+Ci0gICAgICA8Y29udGV4dC1wYXJhbSBpZD0iQ29udGV4dFBhcmFtXzEwNTE2NDM0OTk4NTIiPgotICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8wPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAgIDxjb250ZXh0LXBhcmFtIGlkPSJDb250ZXh0UGFyYW1fMTA1MTY0MzQ5OTg1MyI+Ci0gICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9jb250ZXh0LXBhcmFtPgotICAgICAgPGNvbnRleHQtcGFyYW0gaWQ9IkNvbnRleHRQYXJhbV8xMDUxNjQzNDk5ODYyIj4KLSAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yPC9wYXJhbS1uYW1lPgotICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgICA8Y29udGV4dC1wYXJhbSBpZD0iQ29udGV4dFBhcmFtXzEwNTE2NDM0OTk4NjMiPgotICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAgIDxjb250ZXh0LXBhcmFtIGlkPSJDb250ZXh0UGFyYW1fMTA1MTY0MzQ5OTg3MiI+Ci0gICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9jb250ZXh0LXBhcmFtPgotICAgICAgPGZpbHRlciBpZD0iRmlsdGVyXzEwNTE2NDM0OTk5MDIiPgotICAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgPC9pY29uPgotICAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxmaWx0ZXItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAwMiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yNTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDAzIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yNjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI2PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMDQiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI3PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAwNSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjg8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yODwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDA2Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yOTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI5PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICA8L2ZpbHRlcj4KLSAgICAgIDxmaWx0ZXIgaWQ9IkZpbHRlcl8xMDUxNjQzNTAwMDAyIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzE8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAwNyI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDEyIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzMxPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMTMiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzMyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAxNCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDE1Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM0PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICA8L2ZpbHRlcj4KLSAgICAgIDxmaWx0ZXIgaWQ9IkZpbHRlcl8xMDUxNjQzNTAwMDEyIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzI8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAxNiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zNTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDE3Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zNjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM2PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMTgiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM3PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAxOSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzg8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zODwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDIwIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zOTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM5PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICA8L2ZpbHRlcj4KLSAgICAgIDxmaWx0ZXIgaWQ9IkZpbHRlcl8xMDUxNjQzNTAwMDEzIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzM8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzM8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8zPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEudXRpbC5MaXN0PC9maWx0ZXItY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMjEiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQwPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAyMiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80MTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDMyIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80MjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQyPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMzMiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAzNCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80NDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgPC9maWx0ZXI+Ci0gICAgICA8ZmlsdGVyIGlkPSJGaWx0ZXJfMTA1MTY0MzUwMDAzMiI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV80PC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLnNxbC5EYXRhPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMzUiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ1PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAzNiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80NjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDM3Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80NzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ3PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMzgiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ4PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDA0MiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80OTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgPC9maWx0ZXI+Ci0gICAgICA8ZmlsdGVyLW1hcHBpbmcgaWQ9IkZpbHRlck1hcHBpbmdfMTA1MTY0MzUwMDA4MiI+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8wPC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzA8L3VybC1wYXR0ZXJuPgotICAgICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICAgIDxmaWx0ZXItbWFwcGluZyBpZD0iRmlsdGVyTWFwcGluZ18xMDUxNjQzNTAwMDgzIj4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzE8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgICAgPGZpbHRlci1tYXBwaW5nIGlkPSJGaWx0ZXJNYXBwaW5nXzEwNTE2NDM1MDAwODQiPgotICAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yPC91cmwtcGF0dGVybj4KLSAgICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgICA8ZmlsdGVyLW1hcHBpbmcgaWQ9IkZpbHRlck1hcHBpbmdfMTA1MTY0MzUwMDA4NSI+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8zPC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM8L3VybC1wYXR0ZXJuPgotICAgICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICAgIDxmaWx0ZXItbWFwcGluZyBpZD0iRmlsdGVyTWFwcGluZ18xMDUxNjQzNTAwMDg2Ij4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzQ8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgICAgPGxpc3RlbmVyIGlkPSJMaXN0ZW5lcl8xMDUxNjQzNTAwMTEyIj4KLSAgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgICA8L2xpc3RlbmVyPgotICAgICAgPGxpc3RlbmVyIGlkPSJMaXN0ZW5lcl8xMDUxNjQzNTAwMTEzIj4KLSAgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9saXN0ZW5lci1jbGFzcz4KLSAgICAgIDwvbGlzdGVuZXI+Ci0gICAgICA8bGlzdGVuZXIgaWQ9Ikxpc3RlbmVyXzEwNTE2NDM1MDAxMTQiPgotICAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2xpc3RlbmVyLWNsYXNzPgotICAgICAgPC9saXN0ZW5lcj4KLSAgICAgIDxsaXN0ZW5lciBpZD0iTGlzdGVuZXJfMTA1MTY0MzUwMDExNSI+Ci0gICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2xpc3RlbmVyLWNsYXNzPgotICAgICAgPC9saXN0ZW5lcj4KLSAgICAgIDxsaXN0ZW5lciBpZD0iTGlzdGVuZXJfMTA1MTY0MzUwMDExNiI+Ci0gICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS5zcWwuRGF0YTwvbGlzdGVuZXItY2xhc3M+Ci0gICAgICA8L2xpc3RlbmVyPgotICAgICAgPHNlcnZsZXQgaWQ9IlNlcnZsZXRfMTA1MTY0MzUwMDIxMiI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzA8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGpzcC1maWxlPmpzcEZpbGVfMDwvanNwLWZpbGU+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyMzIiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8wPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDIzMyI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjM0Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyMzUiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDIzNiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4wPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgICA8cnVuLWFzIGlkPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5XzEwNTE2NDM1MDAyMzIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyNzIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18wPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI3MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjc0Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyNzUiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI3NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICA8L3NlcnZsZXQ+Ci0gICAgICA8c2VydmxldCBpZD0iU2VydmxldF8xMDUxNjQzNTAwMjcyIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMTwvc2VydmxldC1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VydmxldC1jbGFzcz5jbGFzc05hbWVfMDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI3MiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjczIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV82PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyNzQiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzc8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV83PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI3NSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjc2Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV85PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICAgICAgIDxydW4tYXMgaWQ9IlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfMTA1MTY0MzUwMDI3MiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI3NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzU8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjc4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV82PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNjwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyODIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua183PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI4MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzg8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjg0Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV85PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfOTwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgIDwvc2VydmxldD4KLSAgICAgIDxzZXJ2bGV0IGlkPSJTZXJ2bGV0XzEwNTE2NDM1MDAyODIiPgotICAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMjwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8yPC9sYXJnZS1pY29uPgotICAgICAgICAgPC9pY29uPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8yPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxqc3AtZmlsZT5qc3BGaWxlXzE8L2pzcC1maWxlPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjgyIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xMDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzEwPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyODMiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzExPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI4NCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xMjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjg1Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xMzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzEzPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyODYiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE0PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MjwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICAgPHJ1bi1hcyBpZD0iUnVuQXNTcGVjaWZpZWRJZGVudGl0eV8xMDUxNjQzNTAwMjgyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjg1Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMDwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyODYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzExPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI4NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTI8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjg4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMzwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyODkiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE0PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgPC9zZXJ2bGV0PgotICAgICAgPHNlcnZsZXQgaWQ9IlNlcnZsZXRfMTA1MTY0MzUwMDI4MyI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlcnZsZXQtY2xhc3M+Y2xhc3NOYW1lXzE8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyODciPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE1PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI4OCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjkyIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xNzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE3PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyOTMiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE4PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI5NCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4zPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgICA8cnVuLWFzIGlkPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5XzEwNTE2NDM1MDAyOTIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyOTIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE1PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI5MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTY8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjk0Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNzwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyOTUiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE4PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI5NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTk8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICA8L3NlcnZsZXQ+Ci0gICAgICA8c2VydmxldCBpZD0iU2VydmxldF8xMDUxNjQzNTAwMjkyIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzQ8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfNDwvc2VydmxldC1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8anNwLWZpbGU+anNwRmlsZV8yPC9qc3AtZmlsZT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI5NSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjk2Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzIxPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyOTciPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzIyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI5OCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjk5Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI0PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjQ8L2xvYWQtb24tc3RhcnR1cD4KLSAgICAgICAgIDxydW4tYXMgaWQ9IlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfMTA1MTY0MzUwMDI5MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI5NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjA8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjk4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMTwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyOTkiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIyPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDMwMCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjM8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMzAxIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNDwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgIDwvc2VydmxldD4KLSAgICAgIDxzZXJ2bGV0LW1hcHBpbmcgaWQ9IlNlcnZsZXRNYXBwaW5nXzEwNTE2NDM1MDAzMTIiPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8wPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8wPC91cmwtcGF0dGVybj4KLSAgICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgICAgPHNlcnZsZXQtbWFwcGluZyBpZD0iU2VydmxldE1hcHBpbmdfMTA1MTY0MzUwMDMxMyI+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzE8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE8L3VybC1wYXR0ZXJuPgotICAgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICA8c2VydmxldC1tYXBwaW5nIGlkPSJTZXJ2bGV0TWFwcGluZ18xMDUxNjQzNTAwMzE0Ij4KLSAgICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMjwvc2VydmxldC1uYW1lPgotICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICAgIDxzZXJ2bGV0LW1hcHBpbmcgaWQ9IlNlcnZsZXRNYXBwaW5nXzEwNTE2NDM1MDAzMTUiPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8zPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zPC91cmwtcGF0dGVybj4KLSAgICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgICAgPHNlcnZsZXQtbWFwcGluZyBpZD0iU2VydmxldE1hcHBpbmdfMTA1MTY0MzUwMDMxNiI+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ8L3VybC1wYXR0ZXJuPgotICAgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICA8c2Vzc2lvbi1jb25maWcgaWQ9IlNlc3Npb25Db25maWdfMTA1MTY0MzUwMDMxMiI+Ci0gICAgICAgICA8c2Vzc2lvbi10aW1lb3V0PjA8L3Nlc3Npb24tdGltZW91dD4KLSAgICAgIDwvc2Vzc2lvbi1jb25maWc+Ci0gICAgICA8bWltZS1tYXBwaW5nIGlkPSJNaW1lTWFwcGluZ18xMDUxNjQzNTAwMzMyIj4KLSAgICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzA8L2V4dGVuc2lvbj4KLSAgICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMDwvbWltZS10eXBlPgotICAgICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgICA8bWltZS1tYXBwaW5nIGlkPSJNaW1lTWFwcGluZ18xMDUxNjQzNTAwMzMzIj4KLSAgICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzE8L2V4dGVuc2lvbj4KLSAgICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMTwvbWltZS10eXBlPgotICAgICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgICA8bWltZS1tYXBwaW5nIGlkPSJNaW1lTWFwcGluZ18xMDUxNjQzNTAwMzM0Ij4KLSAgICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzI8L2V4dGVuc2lvbj4KLSAgICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMjwvbWltZS10eXBlPgotICAgICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgICA8bWltZS1tYXBwaW5nIGlkPSJNaW1lTWFwcGluZ18xMDUxNjQzNTAwMzM1Ij4KLSAgICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzM8L2V4dGVuc2lvbj4KLSAgICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMzwvbWltZS10eXBlPgotICAgICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgICA8bWltZS1tYXBwaW5nIGlkPSJNaW1lTWFwcGluZ18xMDUxNjQzNTAwMzM2Ij4KLSAgICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzQ8L2V4dGVuc2lvbj4KLSAgICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfNDwvbWltZS10eXBlPgotICAgICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgICA8d2VsY29tZS1maWxlLWxpc3QgaWQ9IldlbGNvbWVGaWxlTGlzdF8xMDUxNjQzNTAwMzMyIj4KLSAgICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfMDwvd2VsY29tZS1maWxlPgotICAgICAgICAgPHdlbGNvbWUtZmlsZT53ZWxjb21lRmlsZV8xPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzI8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfMzwvd2VsY29tZS1maWxlPgotICAgICAgICAgPHdlbGNvbWUtZmlsZT53ZWxjb21lRmlsZV80PC93ZWxjb21lLWZpbGU+Ci0gICAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotICAgICAgPGVycm9yLXBhZ2UgaWQ9IkV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfMTA1MTY0MzUwMDM0MiI+Ci0gICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvZXhjZXB0aW9uLXR5cGU+Ci0gICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMDwvbG9jYXRpb24+Ci0gICAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgICA8ZXJyb3ItcGFnZSBpZD0iRXJyb3JDb2RlRXJyb3JQYWdlXzEwNTE2NDM1MDAzNDIiPgotICAgICAgICAgPGVycm9yLWNvZGU+ZXJyb3JDb2RlXzA8L2Vycm9yLWNvZGU+Ci0gICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMTwvbG9jYXRpb24+Ci0gICAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgICA8ZXJyb3ItcGFnZSBpZD0iRXhjZXB0aW9uVHlwZUVycm9yUGFnZV8xMDUxNjQzNTAwMzQzIj4KLSAgICAgICAgIDxleGNlcHRpb24tdHlwZT5qYXZhLnV0aWwuTGlzdDwvZXhjZXB0aW9uLXR5cGU+Ci0gICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMjwvbG9jYXRpb24+Ci0gICAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgICA8ZXJyb3ItcGFnZSBpZD0iRXJyb3JDb2RlRXJyb3JQYWdlXzEwNTE2NDM1MDAzNDMiPgotICAgICAgICAgPGVycm9yLWNvZGU+ZXJyb3JDb2RlXzE8L2Vycm9yLWNvZGU+Ci0gICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMzwvbG9jYXRpb24+Ci0gICAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgICA8ZXJyb3ItcGFnZSBpZD0iRXhjZXB0aW9uVHlwZUVycm9yUGFnZV8xMDUxNjQzNTAwMzUyIj4KLSAgICAgICAgIDxleGNlcHRpb24tdHlwZT5qYXZhLnNxbC5EYXRhPC9leGNlcHRpb24tdHlwZT4KLSAgICAgICAgIDxsb2NhdGlvbj5sb2NhdGlvbl80PC9sb2NhdGlvbj4KLSAgICAgIDwvZXJyb3ItcGFnZT4KLSAgICAgIDx0YWdsaWIgaWQ9IlRhZ0xpYlJlZl8xMDUxNjQzNTAwMzYyIj4KLSAgICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8wPC90YWdsaWItdXJpPgotICAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8wPC90YWdsaWItbG9jYXRpb24+Ci0gICAgICA8L3RhZ2xpYj4KLSAgICAgIDx0YWdsaWIgaWQ9IlRhZ0xpYlJlZl8xMDUxNjQzNTAwMzYzIj4KLSAgICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8xPC90YWdsaWItdXJpPgotICAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8xPC90YWdsaWItbG9jYXRpb24+Ci0gICAgICA8L3RhZ2xpYj4KLSAgICAgIDx0YWdsaWIgaWQ9IlRhZ0xpYlJlZl8xMDUxNjQzNTAwMzY0Ij4KLSAgICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8yPC90YWdsaWItdXJpPgotICAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8yPC90YWdsaWItbG9jYXRpb24+Ci0gICAgICA8L3RhZ2xpYj4KLSAgICAgIDx0YWdsaWIgaWQ9IlRhZ0xpYlJlZl8xMDUxNjQzNTAwMzY1Ij4KLSAgICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8zPC90YWdsaWItdXJpPgotICAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8zPC90YWdsaWItbG9jYXRpb24+Ci0gICAgICA8L3RhZ2xpYj4KLSAgICAgIDx0YWdsaWIgaWQ9IlRhZ0xpYlJlZl8xMDUxNjQzNTAwMzY2Ij4KLSAgICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV80PC90YWdsaWItdXJpPgotICAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl80PC90YWdsaWItbG9jYXRpb24+Ci0gICAgICA8L3RhZ2xpYj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjQzNTAwMzgyIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTY0MzUwMDM4MyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTY0MzUwMDM4NCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTY0MzUwMDM4NSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2NDM1MDAzODYiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTY0MzUwMDQwMiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjQzNTAwNDAzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjQzNTAwNDA0Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2NDM1MDA0MDUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2NDM1MDA0MDYiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQgaWQ9IlNlY3VyaXR5Q29uc3RyYWludF8xMDUxNjQzNTAwNDMyIj4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ1MiI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzA8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDUzIj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ1NCI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzI8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ1NSI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzM8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDYyIj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQgaWQ9IkF1dGhDb25zdHJhaW50XzEwNTE2NDM1MDA0NjIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICAgPHVzZXItZGF0YS1jb25zdHJhaW50IGlkPSJVc2VyRGF0YUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2MiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5OT05FPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgIDxzZWN1cml0eS1jb25zdHJhaW50IGlkPSJTZWN1cml0eUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2MiI+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NjMiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV81PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDY0Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNjwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDY1Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ2NiI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzg8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ2NyI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzk8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPGF1dGgtY29uc3RyYWludCBpZD0iQXV0aENvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc183PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfOTwvcm9sZS1uYW1lPgotICAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQgaWQ9IlVzZXJEYXRhQ29uc3RyYWludF8xMDUxNjQzNTAwNDYzIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx0cmFuc3BvcnQtZ3VhcmFudGVlPklOVEVHUkFMPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgIDxzZWN1cml0eS1jb25zdHJhaW50IGlkPSJTZWN1cml0eUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2MyI+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NjgiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xMDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDY5Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTE8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3MCI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzEyPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3MSI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzEzPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDcyIj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTQ8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzcwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzcxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzcyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzczPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzc0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8YXV0aC1jb25zdHJhaW50IGlkPSJBdXRoQ29uc3RyYWludF8xMDUxNjQzNTAwNDY0Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTQ8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICAgPHVzZXItZGF0YS1jb25zdHJhaW50IGlkPSJVc2VyRGF0YUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2NCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5DT05GSURFTlRJQUw8L3RyYW5zcG9ydC1ndWFyYW50ZWU+Ci0gICAgICAgICA8L3VzZXItZGF0YS1jb25zdHJhaW50PgotICAgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQgaWQ9IlNlY3VyaXR5Q29uc3RyYWludF8xMDUxNjQzNTAwNDY0Ij4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3MyI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE1PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDc0Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTY8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NzUiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xNzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDc2Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTg8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzkwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzkxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzkyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzkzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzk0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3NyI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE5PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPGF1dGgtY29uc3RyYWludCBpZD0iQXV0aENvbnN0cmFpbnRfMTA1MTY0MzUwMDQ3MiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE5PC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgICAgIDx1c2VyLWRhdGEtY29uc3RyYWludCBpZD0iVXNlckRhdGFDb25zdHJhaW50XzEwNTE2NDM1MDA0NzIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHRyYW5zcG9ydC1ndWFyYW50ZWU+Tk9ORTwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICA8c2VjdXJpdHktY29uc3RyYWludCBpZD0iU2VjdXJpdHlDb25zdHJhaW50XzEwNTE2NDM1MDA0NzIiPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDc4Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjA8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTAyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3OSI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIxPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDgwIj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjI8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTEyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ4MSI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIzPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0ODIiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yNDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTIwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTIzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQgaWQ9IkF1dGhDb25zdHJhaW50XzEwNTE2NDM1MDA0NzMiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yNDwvcm9sZS1uYW1lPgotICAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQgaWQ9IlVzZXJEYXRhQ29uc3RyYWludF8xMDUxNjQzNTAwNDczIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx0cmFuc3BvcnQtZ3VhcmFudGVlPklOVEVHUkFMPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgIDxsb2dpbi1jb25maWcgaWQ9IkxvZ2luQ29uZmlnXzEwNTE2NDM1MDA0ODIiPgotICAgICAgICAgPGF1dGgtbWV0aG9kPkJBU0lDPC9hdXRoLW1ldGhvZD4KLSAgICAgICAgIDxyZWFsbS1uYW1lPnJlYWxtTmFtZV8wPC9yZWFsbS1uYW1lPgotICAgICAgICAgPGZvcm0tbG9naW4tY29uZmlnIGlkPSJGb3JtTG9naW5Db25maWdfMTA1MTY0MzUwMDQ4MiI+Ci0gICAgICAgICAgICA8Zm9ybS1sb2dpbi1wYWdlPmZvcm1Mb2dpblBhZ2VfMDwvZm9ybS1sb2dpbi1wYWdlPgotICAgICAgICAgICAgPGZvcm0tZXJyb3ItcGFnZT5mb3JtRXJyb3JQYWdlXzA8L2Zvcm0tZXJyb3ItcGFnZT4KLSAgICAgICAgIDwvZm9ybS1sb2dpbi1jb25maWc+Ci0gICAgICA8L2xvZ2luLWNvbmZpZz4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTY0MzUwMDQ5MiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTY0MzUwMDQ5MyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTY0MzUwMDQ5NCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTY0MzUwMDQ5NSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTY0MzUwMDQ5NiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2NDM1MDA1MTMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTY0MzUwMDUxNCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTY0MzUwMDUxNSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTY0MzUwMDUxNiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjQzNTAwNTE3Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2NDM1MDA1MzMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8wPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2NDM1MDA1MzQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTY0MzUwMDUzNSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTY0MzUwMDUzNiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMzwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjQzNTAwNTM3Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2NDM1MDA1NTMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICA8bG9jYWw+cmVtb3RlXzU8L2xvY2FsPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfNTwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTY0MzUwMDU1NCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICA8bG9jYWw+cmVtb3RlXzY8L2xvY2FsPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTY0MzUwMDU1NSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzwvbG9jYWw+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua183PC9lamItbGluaz4KLSAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjQzNTAwNTU2Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV84PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODwvbG9jYWwtaG9tZT4KLSAgICAgICAgIDxsb2NhbD5yZW1vdGVfODwvbG9jYWw+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua184PC9lamItbGluaz4KLSAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjQzNTAwNTU3Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85PC9sb2NhbC1ob21lPgotICAgICAgICAgPGxvY2FsPnJlbW90ZV85PC9sb2NhbD4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmoyZWUvbG9vc2VBcHAueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmoyZWUvbG9vc2VBcHAueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTNhZTBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlL2xvb3NlQXBwLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4NCi08b3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWc6TG9vc2VBcHBsaWNhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnPSJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIgdXJpPSJcZDpcd29ya1xXVFBcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0c1xjb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVIiIGJpbmFyaWVzUGF0aD0iXGQ6XHdvcmtcV1RQXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHNcY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSIiByZXNvdXJjZXNQYXRoPSJcZDpcd29ya1xXVFBcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0c1xjb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVIiPg0KLSAgPGxvb3NlQXJjaGl2ZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlTW9kdWxlIiB1cmk9Ikxvb3NlRUFSRWpiLmphciIgYmluYXJpZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJFamJcYmluIiByZXNvdXJjZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJFamJcYmluIi8+DQotICA8bG9vc2VBcmNoaXZlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWc6TG9vc2VXQVJGaWxlIiB1cmk9Ikxvb3NlRUFSV2ViLndhciIgYmluYXJpZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJXZWJcd2ViQXBwbGljYXRpb24iIHJlc291cmNlc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUldlYlx3ZWJBcHBsaWNhdGlvbiI+DQotICAgIDxsb29zZUxpYnMgdXJpPSJXRUItSU5GL2xpYi9saWJyYXJ5LmphciIgYmluYXJpZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VKYXZhV2ViTGliXGJpbiIgcmVzb3VyY2VzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlSmF2YVdlYkxpYlxiaW4iLz4NCi0gIDwvbG9vc2VBcmNoaXZlcz4NCi0gIDxsb29zZUFyY2hpdmVzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZUxpYnJhcnkiIHVyaT0idXRpbC5qYXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlSmF2YVV0aWxcYmluIiByZXNvdXJjZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VKYXZhVXRpbFxiaW4iLz4NCi08L29yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlQXBwbGljYXRpb24+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmoyZWUvbG9vc2VDb25maWcueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmoyZWUvbG9vc2VDb25maWcueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGZmYWY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlL2xvb3NlQ29uZmlnLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+DQotPG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnPSJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSI+DQotICA8YXBwbGljYXRpb25zIHVyaT0iXGQ6XHdvcmtcV1RQXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHNcY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSIiBiaW5hcmllc1BhdGg9IlxkOlx3b3JrXFdUUFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzXGNvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUiIgcmVzb3VyY2VzUGF0aD0iXGQ6XHdvcmtcV1RQXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHNcY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSIj4NCi0gICAgPGxvb3NlQXJjaGl2ZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlTW9kdWxlIiB1cmk9Ikxvb3NlRUFSRWpiLmphciIgYmluYXJpZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJFamJcYmluIiByZXNvdXJjZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJFamJcYmluIi8+DQotICAgIDxsb29zZUFyY2hpdmVzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZVdBUkZpbGUiIHVyaT0iTG9vc2VFQVJXZWIud2FyIiBiaW5hcmllc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUldlYlx3ZWJBcHBsaWNhdGlvbiIgcmVzb3VyY2VzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSV2ViXHdlYkFwcGxpY2F0aW9uIj4NCi0gICAgICA8bG9vc2VMaWJzIHVyaT0iV0VCLUlORi9saWIvbGlicmFyeS5qYXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlSmF2YVdlYkxpYlxiaW4iIHJlc291cmNlc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUphdmFXZWJMaWJcYmluIi8+DQotICAgIDwvbG9vc2VBcmNoaXZlcz4NCi0gICAgPGxvb3NlQXJjaGl2ZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlTGlicmFyeSIgdXJpPSJ1dGlsLmphciIgYmluYXJpZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VKYXZhVXRpbFxiaW4iIHJlc291cmNlc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUphdmFVdGlsXGJpbiIvPg0KLSAgPC9hcHBsaWNhdGlvbnM+DQotPC9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZUNvbmZpZ3VyYXRpb24+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExY2Q2Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiPgotICAgIDxtb2R1bGU+Ci0gICAgICAgIDxjb25uZWN0b3I+Zm9vUkFSPC9jb25uZWN0b3I+Ci0gICAgPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvZm9vUkFSL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvZm9vUkFSL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL2Zvb1JBUi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL2Zvb1JBUi9NRVRBLUlORi9yYS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9mb29SQVIvTUVUQS1JTkYvcmEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzQxYzUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL2Zvb1JBUi9NRVRBLUlORi9yYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBjb25uZWN0b3IgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgQ29ubmVjdG9yIDEuMC8vRU4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzFfMC5kdGQiPgotPGNvbm5lY3Rvcj4KLSAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgPGljb24+Ci0gICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICA8L2ljb24+Ci0gICAgPHZlbmRvci1uYW1lPnZlbmRvck5hbWVfMDwvdmVuZG9yLW5hbWU+Ci0gICAgPHNwZWMtdmVyc2lvbj4xLjA8L3NwZWMtdmVyc2lvbj4KLSAgICA8ZWlzLXR5cGU+ZWlzVHlwZV8wPC9laXMtdHlwZT4KLSAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPGxpY2Vuc2U+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxpY2Vuc2UtcmVxdWlyZWQ+dHJ1ZTwvbGljZW5zZS1yZXF1aXJlZD4KLSAgICA8L2xpY2Vuc2U+Ci0gICAgPHJlc291cmNlYWRhcHRlcj4KLSAgICAgICAgPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz5tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc18wPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0gICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Y29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VfMDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz5jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc18wPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotICAgICAgICA8Y29ubmVjdGlvbi1pbnRlcmZhY2U+Y29ubmVjdGlvbkludGVyZmFjZV8wPC9jb25uZWN0aW9uLWludGVyZmFjZT4KLSAgICAgICAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb25uZWN0aW9uSW1wbENsYXNzXzA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLSAgICAgICAgPHRyYW5zYWN0aW9uLXN1cHBvcnQ+Tm9UcmFuc2FjdGlvbjwvdHJhbnNhY3Rpb24tc3VwcG9ydD4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzA8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPnR5cGVfMDwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzA8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8xPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzE8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8xPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMjwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV8yPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMjwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzM8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPnR5cGVfMzwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzM8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV80PC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzQ8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV80PC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQ8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfMDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NTwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV8xPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV8yPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1PC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5jcmVkZW50aWFsSW50ZXJmYWNlXzM8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5jcmVkZW50aWFsSW50ZXJmYWNlXzQ8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPHJlYXV0aGVudGljYXRpb24tc3VwcG9ydD50cnVlPC9yZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+Ci0gICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzA8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8xPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMjwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzM8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl80PC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICA8L3Jlc291cmNlYWRhcHRlcj4KLTwvY29ubmVjdG9yPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvTUVUQS1JTkYvLm1vZHVsZW1hcHMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi9NRVRBLUlORi8ubW9kdWxlbWFwcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyMGE5Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi9NRVRBLUlORi8ubW9kdWxlbWFwcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08bW9kdWxlbWFwOkVBUlByb2plY3RNYXAgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczptb2R1bGVtYXA9Im1vZHVsZW1hcC54bWkiIHhtbG5zOmFwcGxpY2F0aW9uPSJhcHBsaWNhdGlvbi54bWkiIHhtaTppZD0iRUFSUHJvamVjdE1hcF8xIj4NCi0gIDxtYXBwaW5ncyB4bWk6aWQ9Ik1vZHVsZU1hcHBpbmdfMSIgcHJvamVjdE5hbWU9Ikxvb3NlRUFSRWpiIj4NCi0gICAgPG1vZHVsZSB4bWk6dHlwZT0iYXBwbGljYXRpb246RWpiTW9kdWxlIiBocmVmPSJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwjRWpiTW9kdWxlXzEiLz4NCi0gIDwvbWFwcGluZ3M+DQotICA8bWFwcGluZ3MgeG1pOmlkPSJNb2R1bGVNYXBwaW5nXzIiIHByb2plY3ROYW1lPSJMb29zZUVBUldlYiI+DQotICAgIDxtb2R1bGUgeG1pOnR5cGU9ImFwcGxpY2F0aW9uOldlYk1vZHVsZSIgaHJlZj0iTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sI1dlYk1vZHVsZV8xIi8+DQotICA8L21hcHBpbmdzPg0KLTwvbW9kdWxlbWFwOkVBUlByb2plY3RNYXA+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjA2N2Y2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYXBwbGljYXRpb24gUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjIvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvYXBwbGljYXRpb25fMV8yLmR0ZCI+Ci08YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIj4KLQk8ZGlzcGxheS1uYW1lPkxvb3NlRUFSPC9kaXNwbGF5LW5hbWU+Ci0JPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzEiPgotCQk8ZWpiPkxvb3NlRUFSRWpiLmphcjwvZWpiPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IldlYk1vZHVsZV8xIj4KLQkJPHdlYj4KLQkJCTx3ZWItdXJpPkxvb3NlRUFSV2ViLndhcjwvd2ViLXVyaT4KLQkJCTxjb250ZXh0LXJvb3Q+TG9vc2VFQVJXZWI8L2NvbnRleHQtcm9vdD48L3dlYj4KLQk8L21vZHVsZT4KLTwvYXBwbGljYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi9NRVRBLUlORi9pYm0tYXBwbGljYXRpb24tZXh0LnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSL01FVEEtSU5GL2libS1hcHBsaWNhdGlvbi1leHQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2ZiZDBkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSL01FVEEtSU5GL2libS1hcHBsaWNhdGlvbi1leHQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08YXBwbGljYXRpb25leHQ6QXBwbGljYXRpb25FeHRlbnNpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczphcHBsaWNhdGlvbmV4dD0iYXBwbGljYXRpb25leHQueG1pIiB4bWxuczphcHBsaWNhdGlvbj0iYXBwbGljYXRpb24ueG1pIiB4bWk6aWQ9IkFwcGxpY2F0aW9uX0lEX0V4dCI+DQotICA8bW9kdWxlRXh0ZW5zaW9ucyB4bWk6dHlwZT0iYXBwbGljYXRpb25leHQ6RWpiTW9kdWxlRXh0ZW5zaW9uIiB4bWk6aWQ9IkVqYk1vZHVsZV8xX0V4dCIgYWJzb2x1dGVQYXRoPSJEOlxXU0FEX0RFVlxlY2xpcHNlXHdvcmtzcGFjZVxMb29zZUVBUkVqYlxiaW4iPg0KLSAgICA8bW9kdWxlIHhtaTp0eXBlPSJhcHBsaWNhdGlvbjpFamJNb2R1bGUiIGhyZWY9Ik1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCNFamJNb2R1bGVfMSIvPg0KLSAgPC9tb2R1bGVFeHRlbnNpb25zPg0KLSAgPG1vZHVsZUV4dGVuc2lvbnMgeG1pOnR5cGU9ImFwcGxpY2F0aW9uZXh0OldlYk1vZHVsZUV4dGVuc2lvbiIgeG1pOmlkPSJXZWJNb2R1bGVfMV9FeHQiIGFic29sdXRlUGF0aD0iRDpcV1NBRF9ERVZcZWNsaXBzZVx3b3Jrc3BhY2VcTG9vc2VFQVJXZWJcd2ViQXBwbGljYXRpb24iPg0KLSAgICA8bW9kdWxlIHhtaTp0eXBlPSJhcHBsaWNhdGlvbjpXZWJNb2R1bGUiIGhyZWY9Ik1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCNXZWJNb2R1bGVfMSIvPg0KLSAgPC9tb2R1bGVFeHRlbnNpb25zPg0KLSAgPGFwcGxpY2F0aW9uIGhyZWY9Ik1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCNBcHBsaWNhdGlvbl9JRCIvPg0KLTwvYXBwbGljYXRpb25leHQ6QXBwbGljYXRpb25FeHRlbnNpb24+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSQXBwL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSQXBwL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0ZDkxZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiPgotICAgIDxtb2R1bGU+Ci0gICAgICAgIDxqYXZhPmZvb0FQUDwvamF2YT4KLSAgICA8L21vZHVsZT4KLTwvYXBwbGljYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9mb29BUFAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9mb29BUFAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQL01FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9mb29BUFAvTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZWQ3Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9mb29BUFAvTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uLWNsaWVudCBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIENsaWVudCAxLjMvL0VOIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkIj4KLTxhcHBsaWNhdGlvbi1jbGllbnQgaWQ9IkFwcGxpY2F0aW9uLWNsaWVudF9JRCI+Ci0gICAgPGljb24+Ci0gICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICA8L2ljb24+Ci0gICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8xPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzQ8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMzwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPGNhbGxiYWNrLWhhbmRsZXI+amF2YS51dGlsLkhhc2hUYWJsZTwvY2FsbGJhY2staGFuZGxlcj4KLTwvYXBwbGljYXRpb24tY2xpZW50PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNWNhZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZWpiTW9kdWxlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9XZWJTcGhlcmUgQXBwbGljYXRpb24gU2VydmVyIHY2LjAgSlJFIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0iY29tLmlibS53dHAuc2VydmVyLmphdmEuY29yZS5jb250YWluZXIvY29tLmlibS53cy5hc3Quc3QucnVudGltZS5jb3JlLnJ1bnRpbWVUYXJnZXQudjYwL1dlYlNwaGVyZSBBcHBsaWNhdGlvbiBTZXJ2ZXIgdjYuMCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImVqYk1vZHVsZSIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8uajJlZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5qMmVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTk5NjlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5qMmVlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxqMmVlc2V0dGluZ3MgdmVyc2lvbj0iNjAwIj4NCi08bW9kdWxldmVyc2lvbj4yMDwvbW9kdWxldmVyc2lvbj4NCi08L2oyZWVzZXR0aW5ncz4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODRmNzUxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+TG9vc2VFQVJFamI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5jb20uaWJtLnd0cC5taWdyYXRpb24uTWlncmF0aW9uQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5jb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnZhbGlkYXRpb25idWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPmNvbS5pYm0ud3RwLmoyZWUuTGliQ29weUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+Y29tLmlibS5ldG9vbHMuajJlZS5MaWJDb3B5QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC5KYXZhRU1GTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ldG9vbHMuajJlZS5FSkIyXzBOYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5jb20uaWJtLnd0cC5lamIuRUpCTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5CZWFuSW5mb05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLnJ1bnRpbWUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8ucnVudGltZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjNWQ0MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8ucnVudGltZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cnVudGltZSBydW50aW1lLWlkPSJXZWJTcGhlcmUgQXBwbGljYXRpb24gU2VydmVyIHY2LjAiLz4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYmFkMjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNsYXNzLVBhdGg6IHV0aWwuamFyIC4uL2Jvby5qYXIKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL2VqYi1qYXIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL2VqYi1qYXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGNlMWU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9lamItamFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvZWpiLWphcl8xXzEuZHRkIj4KLTxlamItamFyIGlkPSJlamItamFyX0lEIj4KLQk8ZGlzcGxheS1uYW1lPkxvb3NlRUFSRWpiPC9kaXNwbGF5LW5hbWU+Ci0JPGVudGVycHJpc2UtYmVhbnM+Ci0JCTxlbnRpdHkgaWQ9Ik15Q01QIj4KLQkJCTxlamItbmFtZT5NeUNNUDwvZWpiLW5hbWU+Ci0JCQk8aG9tZT5jb20uaWJtLnRlc3QuZWpiLk15Q01QSG9tZTwvaG9tZT4KLQkJCTxyZW1vdGU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDwvcmVtb3RlPgotCQkJPGVqYi1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QQmVhbjwvZWpiLWNsYXNzPgotCQkJPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotCQkJPHByaW0ta2V5LWNsYXNzPmNvbS5pYm0udGVzdC5lamIuTXlDTVBLZXk8L3ByaW0ta2V5LWNsYXNzPgotCQkJPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotCQkJPGNtcC1maWVsZD4KLQkJCQk8ZmllbGQtbmFtZT5rMTwvZmllbGQtbmFtZT4KLQkJCTwvY21wLWZpZWxkPgotCQk8L2VudGl0eT4KLQk8L2VudGVycHJpc2UtYmVhbnM+Ci08L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9pYm0tZWpiLWphci1ibmQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzNhZjRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9pYm0tZWpiLWphci1ibmQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxlamJibmQ6RUpCSmFyQmluZGluZyB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVqYmJuZD0iZWpiYm5kLnhtaSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWk6aWQ9ImVqYi1qYXJfSURfQm5kIj4NCi0gIDxlamJKYXIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjZWpiLWphcl9JRCIvPg0KLSAgPGVqYkJpbmRpbmdzIHhtaTppZD0iTXlDTVBfQm5kIiBqbmRpTmFtZT0iZWpiL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBIb21lIj4NCi0gICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjTXlDTVAiLz4NCi0gIDwvZWpiQmluZGluZ3M+DQotPC9lamJibmQ6RUpCSmFyQmluZGluZz4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmU3MGE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxlamJleHQ6RUpCSmFyRXh0ZW5zaW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWpiZXh0PSJlamJleHQueG1pIiB4bWxuczplamI9ImVqYi54bWkiIHhtaTppZD0iZWpiLWphcl9JRCI+DQotICA8ZWpiSmFyIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI2VqYi1qYXJfSUQiLz4NCi08L2VqYmV4dDpFSkJKYXJFeHRlbnNpb24+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVAuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmNzI3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9jb20vaWJtL3Rlc3QvZWpiL015Q01QQmVhbi5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9jb20vaWJtL3Rlc3QvZWpiL015Q01QQmVhbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjZWQyZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEJlYW4uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEhvbWUuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEhvbWUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTI1OTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBIb21lLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBLZXkuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEtleS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFiNjcwMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEtleS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvZWpiLWphci54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvZWpiLWphci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YmFlOTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2VqYi1qYXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBlamItamFyIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9lamItamFyXzJfMC5kdGQiPgotPGVqYi1qYXIgaWQ9ImVqYi1qYXJfSUQiPgotCTxkaXNwbGF5LW5hbWU+TG9vc2VFQVJFamI8L2Rpc3BsYXktbmFtZT4KLQk8ZW50ZXJwcmlzZS1iZWFucz4KLQkJPGVudGl0eSBpZD0iQ01QMSI+Ci0JCQk8ZWpiLW5hbWU+Q01QMTwvZWpiLW5hbWU+Ci0JCQk8bG9jYWwtaG9tZT5lamJzLkNNUDFMb2NhbEhvbWU8L2xvY2FsLWhvbWU+Ci0JCQk8bG9jYWw+ZWpicy5DTVAxTG9jYWw8L2xvY2FsPgotCQkJPGVqYi1jbGFzcz5lamJzLkNNUDFCZWFuPC9lamItY2xhc3M+Ci0JCQk8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0JCQk8cHJpbS1rZXktY2xhc3M+ZWpicy5DTVAxS2V5PC9wcmltLWtleS1jbGFzcz4KLQkJCTxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLQkJCTxjbXAtdmVyc2lvbj4yLng8L2NtcC12ZXJzaW9uPgotCQkJPGFic3RyYWN0LXNjaGVtYS1uYW1lPkNNUDE8L2Fic3RyYWN0LXNjaGVtYS1uYW1lPgotCQkJPGNtcC1maWVsZD4KLQkJCQk8ZmllbGQtbmFtZT5pZDwvZmllbGQtbmFtZT4KLQkJCTwvY21wLWZpZWxkPgotCQk8L2VudGl0eT4KLQkJPGVudGl0eSBpZD0iQ01QMiI+Ci0JCQk8ZWpiLW5hbWU+Q01QMjwvZWpiLW5hbWU+Ci0JCQk8bG9jYWwtaG9tZT5lamJzLkNNUDJMb2NhbEhvbWU8L2xvY2FsLWhvbWU+Ci0JCQk8bG9jYWw+ZWpicy5DTVAyTG9jYWw8L2xvY2FsPgotCQkJPGVqYi1jbGFzcz5lamJzLkNNUDJCZWFuPC9lamItY2xhc3M+Ci0JCQk8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0JCQk8cHJpbS1rZXktY2xhc3M+ZWpicy5DTVAyS2V5PC9wcmltLWtleS1jbGFzcz4KLQkJCTxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLQkJCTxjbXAtdmVyc2lvbj4yLng8L2NtcC12ZXJzaW9uPgotCQkJPGFic3RyYWN0LXNjaGVtYS1uYW1lPkNNUDI8L2Fic3RyYWN0LXNjaGVtYS1uYW1lPgotCQkJPGNtcC1maWVsZD4KLQkJCQk8ZmllbGQtbmFtZT5pZDwvZmllbGQtbmFtZT4KLQkJCTwvY21wLWZpZWxkPgotCQk8L2VudGl0eT4KLQk8L2VudGVycHJpc2UtYmVhbnM+Ci08L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9NRVRBLUlORi9pYm0tZWpiLWphci1ibmQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDhkZjk5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9NRVRBLUlORi9pYm0tZWpiLWphci1ibmQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZWpiYm5kOkVKQkphckJpbmRpbmcgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplamI9ImVqYi54bWkiIHhtbG5zOmVqYmJuZD0iZWpiYm5kLnhtaSIgeG1pOmlkPSJFSkJKYXJCaW5kaW5nXzEwOTkwNzY2OTg0ODEiPg0KLSAgPGVqYkphciBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEIi8+DQotICA8ZWpiQmluZGluZ3MgeG1pOmlkPSJFbnRlcnByaXNlQmVhbkJpbmRpbmdfMTA5OTA3NjY5ODQ5MSIgam5kaU5hbWU9ImVqYi9lamJzL0NNUDFMb2NhbEhvbWUiPg0KLSAgICA8ZW50ZXJwcmlzZUJlYW4geG1pOnR5cGU9ImVqYjpDb250YWluZXJNYW5hZ2VkRW50aXR5IiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNDTVAxIi8+DQotICA8L2VqYkJpbmRpbmdzPg0KLSAgPGVqYkJpbmRpbmdzIHhtaTppZD0iRW50ZXJwcmlzZUJlYW5CaW5kaW5nXzEwOTkwNzY3MjkyOTUiIGpuZGlOYW1lPSJlamIvZWpicy9DTVAyTG9jYWxIb21lIj4NCi0gICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQ01QMiIvPg0KLSAgPC9lamJCaW5kaW5ncz4NCi0gIDxkZWZhdWx0Q01QQ29ubmVjdGlvbkZhY3RvcnkgeG1pOmlkPSJDTVBDb25uZWN0aW9uRmFjdG9yeUJpbmRpbmdfMTA5OTA3NjY5ODQ5MSIgam5kaU5hbWU9ImpkYmMvRGVmYXVsdCIgcmVzQXV0aD0iUGVyX0Nvbm5lY3Rpb25fRmFjdG9yeSIvPg0KLTwvZWpiYm5kOkVKQkphckJpbmRpbmc+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlNzBhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZWpiZXh0OkVKQkphckV4dGVuc2lvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVqYmV4dD0iZWpiZXh0LnhtaSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWk6aWQ9ImVqYi1qYXJfSUQiPg0KLSAgPGVqYkphciBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEIi8+DQotPC9lamJleHQ6RUpCSmFyRXh0ZW5zaW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmI4YjdjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgY29tLmlibS50ZXN0LmVqYjsKLS8qKgotICogUmVtb3RlIGludGVyZmFjZSBmb3IgRW50ZXJwcmlzZSBCZWFuOiBNeUNNUAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE15Q01QIGV4dGVuZHMgamF2YXguZWpiLkVKQk9iamVjdCB7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEJlYW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2RiMDQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotcGFja2FnZSBjb20uaWJtLnRlc3QuZWpiOwotLyoqCi0gKiBCZWFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBFbnRlcnByaXNlIEJlYW46IE15Q01QCi0gKi8KLXB1YmxpYyBjbGFzcyBNeUNNUEJlYW4gZXh0ZW5kcyBjb20uaWJtLnRlc3QuQSBpbXBsZW1lbnRzIGphdmF4LmVqYi5FbnRpdHlCZWFuIHsKLQlwcml2YXRlIGphdmF4LmVqYi5FbnRpdHlDb250ZXh0IG15RW50aXR5Q3R4OwotCS8qKgotCSAqIEltcGxlbWV0YXRpb24gZmllbGQgZm9yIHBlcnNpc3RlbnQgYXR0cmlidXRlOiBrMQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGsxOwotCS8qKgotCSAqIGdldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgamF2YXguZWpiLkVudGl0eUNvbnRleHQgZ2V0RW50aXR5Q29udGV4dCgpIHsKLQkJcmV0dXJuIG15RW50aXR5Q3R4OwotCX0KLQkvKioKLQkgKiBzZXRFbnRpdHlDb250ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5Q29udGV4dChqYXZheC5lamIuRW50aXR5Q29udGV4dCBjdHgpIHsKLQkJbXlFbnRpdHlDdHggPSBjdHg7Ci0JfQotCS8qKgotCSAqIHVuc2V0RW50aXR5Q29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RW50aXR5Q29udGV4dCgpIHsKLQkJbXlFbnRpdHlDdHggPSBudWxsOwotCX0KLQkvKioKLQkgKiBlamJBY3RpdmF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYkFjdGl2YXRlKCkgewotCQlfaW5pdExpbmtzKCk7Ci0JfQotCS8qKgotCSAqIGVqYkNyZWF0ZSBtZXRob2QgZm9yIGEgQ01QIGVudGl0eSBiZWFuLgotCSAqLwotCXB1YmxpYyBjb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5IGVqYkNyZWF0ZShqYXZhLmxhbmcuU3RyaW5nIGsxKSB0aHJvd3MgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiB7Ci0JCV9pbml0TGlua3MoKTsKLQkJdGhpcy5rMSA9IGsxOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogZWpiTG9hZAotCSAqLwotCXB1YmxpYyB2b2lkIGVqYkxvYWQoKSB7Ci0JCV9pbml0TGlua3MoKTsKLQl9Ci0JLyoqCi0JICogZWpiUGFzc2l2YXRlCi0JICovCi0JcHVibGljIHZvaWQgZWpiUGFzc2l2YXRlKCkgewotCX0KLQkvKioKLQkgKiBlamJQb3N0Q3JlYXRlCi0JICovCi0JcHVibGljIHZvaWQgZWpiUG9zdENyZWF0ZShqYXZhLmxhbmcuU3RyaW5nIGsxKSB0aHJvd3MgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiB7Ci0JfQotCS8qKgotCSAqIGVqYlJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlJlbW92ZSgpIHRocm93cyBqYXZheC5lamIuUmVtb3ZlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCV9yZW1vdmVMaW5rcygpOwotCQl9IGNhdGNoIChqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IGphdmF4LmVqYi5SZW1vdmVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCS8qKgotCSAqIGVqYlN0b3JlCi0JICovCi0JcHVibGljIHZvaWQgZWpiU3RvcmUoKSB7Ci0JfQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdhcyBnZW5lcmF0ZWQgZm9yIHN1cHBvcnRpbmcgdGhlIGFzc29jaWF0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBfaW5pdExpbmtzKCkgewotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3YXMgZ2VuZXJhdGVkIGZvciBzdXBwb3J0aW5nIHRoZSBhc3NvY2lhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgX2dldExpbmtzKCkgewotCQlqYXZhLnV0aWwuVmVjdG9yIGxpbmtzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQkJcmV0dXJuIGxpbmtzOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3YXMgZ2VuZXJhdGVkIGZvciBzdXBwb3J0aW5nIHRoZSBhc3NvY2lhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgX3JlbW92ZUxpbmtzKCkgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiwgamF2YXguZWpiLlJlbW92ZUV4Y2VwdGlvbiB7Ci0JCWphdmEudXRpbC5MaXN0IGxpbmtzID0gX2dldExpbmtzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlua3Muc2l6ZSgpIDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCSgoY29tLmlibS5pdmouZWpiLmFzc29jaWF0aW9ucy5pbnRlcmZhY2VzLkxpbmspIGxpbmtzLmdldChpKSkucmVtb3ZlKCk7Ci0JCQl9IGNhdGNoIChqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIGUpIHt9IC8vQ29uc3VtZSBGaW5kZXIgZXJyb3Igc2luY2UgSSBhbSBnb2luZyBhd2F5Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEhvbWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QSG9tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzA5ZjIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QSG9tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBjb20uaWJtLnRlc3QuZWpiOwotLyoqCi0gKiBIb21lIGludGVyZmFjZSBmb3IgRW50ZXJwcmlzZSBCZWFuOiBNeUNNUAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE15Q01QSG9tZSBleHRlbmRzIGphdmF4LmVqYi5FSkJIb21lIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBrZXkgZm9yIEVudGl0eSBCZWFuOiBNeUNNUAotCSAqLwotCXB1YmxpYyBjb20uaWJtLnRlc3QuZWpiLk15Q01QIGNyZWF0ZShqYXZhLmxhbmcuU3RyaW5nIGsxKSB0aHJvd3MgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiwgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOwotCS8qKgotCSAqIEZpbmRzIGFuIGluc3RhbmNlIHVzaW5nIGEga2V5IGZvciBFbnRpdHkgQmVhbjogTXlDTVAKLQkgKi8KLQlwdWJsaWMgY29tLmlibS50ZXN0LmVqYi5NeUNNUCBmaW5kQnlQcmltYXJ5S2V5KGNvbS5pYm0udGVzdC5lamIuTXlDTVBLZXkgcHJpbWFyeUtleSkgdGhyb3dzIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24sIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QS2V5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWE2Zjc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1wYWNrYWdlIGNvbS5pYm0udGVzdC5lamI7Ci0vKioKLSAqIEtleSBjbGFzcyBmb3IgRW50aXR5IEJlYW46IE15Q01QCi0gKi8KLXB1YmxpYyBjbGFzcyBNeUNNUEtleSBleHRlbmRzIGNvbS5pYm0udGVzdC5BIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCi0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyMDYwOTM0NTk3NjA4NDYxNjNMOwotCS8qKgotCSAqIEltcGxlbWV0YXRpb24gZmllbGQgZm9yIHBlcnNpc3RlbnQgYXR0cmlidXRlOiBrMQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGsxOwotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkga2V5IGZvciBFbnRpdHkgQmVhbjogTXlDTVAKLQkgKi8KLQlwdWJsaWMgTXlDTVBLZXkoKSB7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIGtleXMgYXJlIGVxdWFsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhqYXZhLmxhbmcuT2JqZWN0IG90aGVyS2V5KSB7Ci0JCWlmIChvdGhlcktleSBpbnN0YW5jZW9mIGNvbS5pYm0udGVzdC5lamIuTXlDTVBLZXkpIHsKLQkJCWNvbS5pYm0udGVzdC5lamIuTXlDTVBLZXkgbyA9IChjb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5KW90aGVyS2V5OwotCQkJcmV0dXJuICgodGhpcy5rMS5lcXVhbHMoby5rMSkpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBmb3IgdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKGsxLmhhc2hDb2RlKCkpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEga2V5IGZvciBFbnRpdHkgQmVhbjogTXlDTVAKLQkgKi8KLQlwdWJsaWMgTXlDTVBLZXkoamF2YS5sYW5nLlN0cmluZyBrMSkgewotCQl0aGlzLmsxID0gazE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUJlYW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NzI3NDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLXBhY2thZ2UgZWpiczsKLS8qKgotICogQmVhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRW50ZXJwcmlzZSBCZWFuOiBDTVAxCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTVAxQmVhbiBpbXBsZW1lbnRzIGphdmF4LmVqYi5FbnRpdHlCZWFuIHsKLQlwcml2YXRlIGphdmF4LmVqYi5FbnRpdHlDb250ZXh0IG15RW50aXR5Q3R4OwotCS8qKgotCSAqIHNldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHlDb250ZXh0KGphdmF4LmVqYi5FbnRpdHlDb250ZXh0IGN0eCkgewotCQlteUVudGl0eUN0eCA9IGN0eDsKLQl9Ci0JLyoqCi0JICogZ2V0RW50aXR5Q29udGV4dAotCSAqLwotCXB1YmxpYyBqYXZheC5lamIuRW50aXR5Q29udGV4dCBnZXRFbnRpdHlDb250ZXh0KCkgewotCQlyZXR1cm4gbXlFbnRpdHlDdHg7Ci0JfQotCS8qKgotCSAqIHVuc2V0RW50aXR5Q29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RW50aXR5Q29udGV4dCgpIHsKLQkJbXlFbnRpdHlDdHggPSBudWxsOwotCX0KLQkvKioKLQkgKiBlamJDcmVhdGUKLQkgKi8KLQlwdWJsaWMgZWpicy5DTVAxS2V5IGVqYkNyZWF0ZShqYXZhLmxhbmcuSW50ZWdlciBpZCkKLQkJdGhyb3dzIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gewotCQlzZXRJZChpZCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBlamJQb3N0Q3JlYXRlCi0JICovCi0JcHVibGljIHZvaWQgZWpiUG9zdENyZWF0ZShqYXZhLmxhbmcuSW50ZWdlciBpZCkKLQkJdGhyb3dzIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gewotCX0KLQkvKioKLQkgKiBlamJBY3RpdmF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYkFjdGl2YXRlKCkgewotCX0KLQkvKioKLQkgKiBlamJMb2FkCi0JICovCi0JcHVibGljIHZvaWQgZWpiTG9hZCgpIHsKLQl9Ci0JLyoqCi0JICogZWpiUGFzc2l2YXRlCi0JICovCi0JcHVibGljIHZvaWQgZWpiUGFzc2l2YXRlKCkgewotCX0KLQkvKioKLQkgKiBlamJSZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJSZW1vdmUoKSB0aHJvd3MgamF2YXguZWpiLlJlbW92ZUV4Y2VwdGlvbiB7Ci0JfQotCS8qKgotCSAqIGVqYlN0b3JlCi0JICovCi0JcHVibGljIHZvaWQgZWpiU3RvcmUoKSB7Ci0JfQotCS8qKgotCSAqIEdldCBhY2Nlc3NvciBmb3IgcGVyc2lzdGVudCBhdHRyaWJ1dGU6IGlkCi0JICovCi0JcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5JbnRlZ2VyIGdldElkKCk7Ci0JLyoqCi0JICogU2V0IGFjY2Vzc29yIGZvciBwZXJzaXN0ZW50IGF0dHJpYnV0ZTogaWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJZChqYXZhLmxhbmcuSW50ZWdlciBuZXdJZCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUtleS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTI0MDE2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLXBhY2thZ2UgZWpiczsKLS8qKgotICogS2V5IGNsYXNzIGZvciBFbnRpdHkgQmVhbjogQ01QMQotICovCi1wdWJsaWMgY2xhc3MgQ01QMUtleSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzIwNjA5MzQ1OTc2MDg0NjE2M0w7Ci0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gZmllbGQgZm9yIHBlcnNpc3RlbnQgYXR0cmlidXRlOiBpZAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuSW50ZWdlciBpZDsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IGtleSBmb3IgRW50aXR5IEJlYW46IENNUDEKLQkgKi8KLQlwdWJsaWMgQ01QMUtleSgpIHsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIGtleSBmb3IgRW50aXR5IEJlYW46IENNUDEKLQkgKi8KLQlwdWJsaWMgQ01QMUtleShqYXZhLmxhbmcuSW50ZWdlciBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIGtleXMgYXJlIGVxdWFsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhqYXZhLmxhbmcuT2JqZWN0IG90aGVyS2V5KSB7Ci0JCWlmIChvdGhlcktleSBpbnN0YW5jZW9mIGVqYnMuQ01QMUtleSkgewotCQkJZWpicy5DTVAxS2V5IG8gPSAoZWpicy5DTVAxS2V5KSBvdGhlcktleTsKLQkJCXJldHVybiAoKHRoaXMuaWQuZXF1YWxzKG8uaWQpKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgZm9yIHRoZSBrZXkuCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIChpZC5oYXNoQ29kZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUxvY2FsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAxTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmZGI1OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAxTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSBlamJzOwotLyoqCi0gKiBMb2NhbCBpbnRlcmZhY2UgZm9yIEVudGVycHJpc2UgQmVhbjogQ01QMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNUDFMb2NhbCBleHRlbmRzIGphdmF4LmVqYi5FSkJMb2NhbE9iamVjdCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUxvY2FsSG9tZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUxvY2FsSG9tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODU2YTMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFMb2NhbEhvbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2UgZWpiczsKLS8qKgotICogTG9jYWwgSG9tZSBpbnRlcmZhY2UgZm9yIEVudGVycHJpc2UgQmVhbjogQ01QMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNUDFMb2NhbEhvbWUgZXh0ZW5kcyBqYXZheC5lamIuRUpCTG9jYWxIb21lIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBrZXkgZm9yIEVudGl0eSBCZWFuOiBDTVAxCi0JICovCi0JcHVibGljIGVqYnMuQ01QMUxvY2FsIGNyZWF0ZShqYXZhLmxhbmcuSW50ZWdlciBpZCkKLQkJdGhyb3dzIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb247Ci0JLyoqCi0JICogRmluZHMgYW4gaW5zdGFuY2UgdXNpbmcgYSBrZXkgZm9yIEVudGl0eSBCZWFuOiBDTVAxCi0JICovCi0JcHVibGljIGVqYnMuQ01QMUxvY2FsIGZpbmRCeVByaW1hcnlLZXkoZWpicy5DTVAxS2V5IHByaW1hcnlLZXkpCi0JCXRocm93cyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJCZWFuLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjlhYmUxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIEJlYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIEVudGVycHJpc2UgQmVhbjogQ01QMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01QMkJlYW4gaW1wbGVtZW50cyBqYXZheC5lamIuRW50aXR5QmVhbiB7Ci0JcHJpdmF0ZSBqYXZheC5lamIuRW50aXR5Q29udGV4dCBteUVudGl0eUN0eDsKLQkvKioKLQkgKiBzZXRFbnRpdHlDb250ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5Q29udGV4dChqYXZheC5lamIuRW50aXR5Q29udGV4dCBjdHgpIHsKLQkJbXlFbnRpdHlDdHggPSBjdHg7Ci0JfQotCS8qKgotCSAqIGdldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgamF2YXguZWpiLkVudGl0eUNvbnRleHQgZ2V0RW50aXR5Q29udGV4dCgpIHsKLQkJcmV0dXJuIG15RW50aXR5Q3R4OwotCX0KLQkvKioKLQkgKiB1bnNldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVudGl0eUNvbnRleHQoKSB7Ci0JCW15RW50aXR5Q3R4ID0gbnVsbDsKLQl9Ci0JLyoqCi0JICogZWpiQ3JlYXRlCi0JICovCi0JcHVibGljIGVqYnMuQ01QMktleSBlamJDcmVhdGUoamF2YS5sYW5nLkludGVnZXIgaWQpCi0JCXRocm93cyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIHsKLQkJc2V0SWQoaWQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogZWpiUG9zdENyZWF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlBvc3RDcmVhdGUoamF2YS5sYW5nLkludGVnZXIgaWQpCi0JCXRocm93cyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIHsKLQl9Ci0JLyoqCi0JICogZWpiQWN0aXZhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJBY3RpdmF0ZSgpIHsKLQl9Ci0JLyoqCi0JICogZWpiTG9hZAotCSAqLwotCXB1YmxpYyB2b2lkIGVqYkxvYWQoKSB7Ci0JfQotCS8qKgotCSAqIGVqYlBhc3NpdmF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlBhc3NpdmF0ZSgpIHsKLQl9Ci0JLyoqCi0JICogZWpiUmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgZWpiUmVtb3ZlKCkgdGhyb3dzIGphdmF4LmVqYi5SZW1vdmVFeGNlcHRpb24gewotCX0KLQkvKioKLQkgKiBlamJTdG9yZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlN0b3JlKCkgewotCX0KLQkvKioKLQkgKiBHZXQgYWNjZXNzb3IgZm9yIHBlcnNpc3RlbnQgYXR0cmlidXRlOiBpZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuSW50ZWdlciBnZXRJZCgpOwotCS8qKgotCSAqIFNldCBhY2Nlc3NvciBmb3IgcGVyc2lzdGVudCBhdHRyaWJ1dGU6IGlkCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SWQoamF2YS5sYW5nLkludGVnZXIgbmV3SWQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJLZXkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlOWJjNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIEtleSBjbGFzcyBmb3IgRW50aXR5IEJlYW46IENNUDIKLSAqLwotcHVibGljIGNsYXNzIENNUDJLZXkgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyMDYwOTM0NTk3NjA4NDYxNjNMOwotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIGZpZWxkIGZvciBwZXJzaXN0ZW50IGF0dHJpYnV0ZTogaWQKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLkludGVnZXIgaWQ7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSBrZXkgZm9yIEVudGl0eSBCZWFuOiBDTVAyCi0JICovCi0JcHVibGljIENNUDJLZXkoKSB7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBrZXkgZm9yIEVudGl0eSBCZWFuOiBDTVAyCi0JICovCi0JcHVibGljIENNUDJLZXkoamF2YS5sYW5nLkludGVnZXIgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBrZXlzIGFyZSBlcXVhbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCBvdGhlcktleSkgewotCQlpZiAob3RoZXJLZXkgaW5zdGFuY2VvZiBlamJzLkNNUDJLZXkpIHsKLQkJCWVqYnMuQ01QMktleSBvID0gKGVqYnMuQ01QMktleSkgb3RoZXJLZXk7Ci0JCQlyZXR1cm4gKCh0aGlzLmlkLmVxdWFscyhvLmlkKSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAoaWQuaGFzaENvZGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJMb2NhbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMkxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YWM3MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMkxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgZWpiczsKLS8qKgotICogTG9jYWwgaW50ZXJmYWNlIGZvciBFbnRlcnByaXNlIEJlYW46IENNUDIKLSAqLwotcHVibGljIGludGVyZmFjZSBDTVAyTG9jYWwgZXh0ZW5kcyBqYXZheC5lamIuRUpCTG9jYWxPYmplY3QgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJMb2NhbEhvbWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJMb2NhbEhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExYmRmOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyTG9jYWxIb21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIExvY2FsIEhvbWUgaW50ZXJmYWNlIGZvciBFbnRlcnByaXNlIEJlYW46IENNUDIKLSAqLwotcHVibGljIGludGVyZmFjZSBDTVAyTG9jYWxIb21lIGV4dGVuZHMgamF2YXguZWpiLkVKQkxvY2FsSG9tZSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEga2V5IGZvciBFbnRpdHkgQmVhbjogQ01QMgotCSAqLwotCXB1YmxpYyBlamJzLkNNUDJMb2NhbCBjcmVhdGUoamF2YS5sYW5nLkludGVnZXIgaWQpCi0JCXRocm93cyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uOwotCS8qKgotCSAqIEZpbmRzIGFuIGluc3RhbmNlIHVzaW5nIGEga2V5IGZvciBFbnRpdHkgQmVhbjogQ01QMgotCSAqLwotCXB1YmxpYyBlamJzLkNNUDJMb2NhbCBmaW5kQnlQcmltYXJ5S2V5KGVqYnMuQ01QMktleSBwcmltYXJ5S2V5KQotCQl0aHJvd3MgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiYjM4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iU0VSVkVSSkRLX1BMVUdJTkRJUi9qcmUvbGliL3J0LmphciIKLSAgICAgICAgcm9vdHBhdGg9InNyYyIgc291cmNlcGF0aD0iU0VSVkVSSkRLX1BMVUdJTkRJUi9zcmMuamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic291cmNlIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iV0FTX1BMVUdJTkRJUi9saWIvajJlZS5qYXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJXQVNfUExVR0lORElSL2xpYi93ZWJjb250YWluZXIuamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iV0FTX1BMVUdJTkRJUi9saWIvaXZqZWpiMzUuamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iV0FTX1BMVUdJTkRJUi9saWIvd2Vic3BoZXJlLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9IndlYkFwcGxpY2F0aW9uXFdFQi1JTkZcY2xhc3NlcyIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi8ud2Vic2V0dGluZ3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi8ud2Vic2V0dGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNWI5YTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvLndlYnNldHRpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdlYnNldHRpbmdzPgotCTxjb250ZXh0LXJvb3Q+TG9vc2VFQVJXZWI8L2NvbnRleHQtcm9vdD4KLTwvd2Vic2V0dGluZ3M+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi9zb3VyY2UvY29tL2libS90ZXN0L3dlYi9DLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi9zb3VyY2UvY29tL2libS90ZXN0L3dlYi9DLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MWIzOTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvc291cmNlL2NvbS9pYm0vdGVzdC93ZWIvQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBjb20uaWJtLnRlc3Qud2ViOwotcHVibGljIGNsYXNzIEMgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEMKLQkgKi8KLQlwdWJsaWMgQygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzUxNjBhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNsYXNzLVBhdGg6IExvb3NlRUFSRWpiLmphcgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2NsYXNzZXMvY29tL2libS90ZXN0L3dlYi9DLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9jbGFzc2VzL2NvbS9pYm0vdGVzdC93ZWIvQy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1MTEzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2NsYXNzZXMvY29tL2libS90ZXN0L3dlYi9DLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9pYm0td2ViLWJuZC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2libS13ZWItYm5kLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc0ODQ0Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2libS13ZWItYm5kLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPHdlYmFwcGJuZDpXZWJBcHBCaW5kaW5nIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6d2ViYXBwYm5kPSJ3ZWJhcHBibmQueG1pIiB4bWxuczp3ZWJhcHBsaWNhdGlvbj0id2ViYXBwbGljYXRpb24ueG1pIiB4bWk6aWQ9IldlYkFwcEJpbmRpbmdfMSIgdmlydHVhbEhvc3ROYW1lPSJkZWZhdWx0X2hvc3QiPgotCTx3ZWJhcHAgaHJlZj0iV0VCLUlORi93ZWIueG1sI1dlYkFwcCIvPgotPC93ZWJhcHBibmQ6V2ViQXBwQmluZGluZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2libS13ZWItZXh0LnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL1dFQi1JTkYvaWJtLXdlYi1leHQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmVjMjYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL1dFQi1JTkYvaWJtLXdlYi1leHQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPHdlYmFwcGV4dDpXZWJBcHBFeHRlbnNpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp3ZWJhcHBleHQ9IndlYmFwcGV4dC54bWkiIHhtbG5zOndlYmFwcGxpY2F0aW9uPSJ3ZWJhcHBsaWNhdGlvbi54bWkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtaTppZD0iV2ViQXBwRXh0ZW5zaW9uXzEiCi0gIHJlbG9hZEludGVydmFsPSIzIgotICByZWxvYWRpbmdFbmFibGVkPSJ0cnVlIgotICBkZWZhdWx0RXJyb3JQYWdlPSJlcnJvci5qc3AiCi0gIGFkZGl0aW9uYWxDbGFzc1BhdGg9IiIKLSAgZmlsZVNlcnZpbmdFbmFibGVkPSJ0cnVlIgotICBkaXJlY3RvcnlCcm93c2luZ0VuYWJsZWQ9ImZhbHNlIgotICBzZXJ2ZVNlcnZsZXRzQnlDbGFzc25hbWVFbmFibGVkPSJ0cnVlIj4KLQk8d2ViQXBwIGhyZWY9IldFQi1JTkYvd2ViLnhtbCNXZWJBcHAiLz4KLTwvd2ViYXBwZXh0OldlYkFwcEV4dGVuc2lvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTJlZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjIvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWFwcF8yXzIuZHRkIj4KLTx3ZWItYXBwIGlkPSJXZWJBcHAiPgotCTxkaXNwbGF5LW5hbWU+TG9vc2VFQVJXZWI8L2Rpc3BsYXktbmFtZT4KLQk8d2VsY29tZS1maWxlLWxpc3Q+Ci0JCTx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotCQk8d2VsY29tZS1maWxlPmluZGV4Lmh0bTwvd2VsY29tZS1maWxlPgotCQk8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotCQk8d2VsY29tZS1maWxlPmRlZmF1bHQuaHRtbDwvd2VsY29tZS1maWxlPgotCQk8d2VsY29tZS1maWxlPmRlZmF1bHQuaHRtPC93ZWxjb21lLWZpbGU+Ci0JCTx3ZWxjb21lLWZpbGU+ZGVmYXVsdC5qc3A8L3dlbGNvbWUtZmlsZT4KLQk8L3dlbGNvbWUtZmlsZS1saXN0PgotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIzZmEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIgcm9vdHBhdGg9IkpSRV9TUkNST09UIiBzb3VyY2VwYXRoPSJKUkVfU1JDIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvYmluL2NvbS9pYm0vdGVzdC9BLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC9iaW4vY29tL2libS90ZXN0L0EuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2ZmZjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC9iaW4vY29tL2libS90ZXN0L0EuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFVdGlsL3NyYy9jb20vaWJtL3Rlc3QvQS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC9zcmMvY29tL2libS90ZXN0L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdmMDljMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFVdGlsL3NyYy9jb20vaWJtL3Rlc3QvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBjb20uaWJtLnRlc3Q7Ci1wdWJsaWMgY2xhc3MgQSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQQotCSAqLwotCXB1YmxpYyBBKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhV2ViTGliLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YjNmYTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhV2ViTGliLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiIHJvb3RwYXRoPSJKUkVfU1JDUk9PVCIgc291cmNlcGF0aD0iSlJFX1NSQyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFXZWJMaWIvYmluL2NvbS9pYm0vd2ViL3Rlc3QvQi5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi9iaW4vY29tL2libS93ZWIvdGVzdC9CLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2VlNTY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi9iaW4vY29tL2libS93ZWIvdGVzdC9CLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhV2ViTGliL3NyYy9jb20vaWJtL3dlYi90ZXN0L0IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi9zcmMvY29tL2libS93ZWIvdGVzdC9CLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMTg1MzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhV2ViTGliL3NyYy9jb20vaWJtL3dlYi90ZXN0L0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgY29tLmlibS53ZWIudGVzdDsKLXB1YmxpYyBjbGFzcyBCIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCCi0JICovCi0JcHVibGljIEIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvYm9vLmphci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL2Jvby5qYXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDNlM2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvYm9vLmphci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DbGFzcy1QYXRoOiB1dGlsLmphciBMb29zZUVBUkVqYi9iaW4gZm9vYmFyLmphciAKLQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9mb29iYXIuamFyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvZm9vYmFyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3Njc5OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9mb29iYXIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvcmVhZG1lLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZDVkMTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgaXMgbm90IGEgZnVsbCAgICAgd29ya3NwYWNlOyBpdCBpcyBqdXN0IHRoZSBmaWxlcyBuZWNlc3NhcnkgdG8gZW11bGF0ZSBvbmUsIGZvciB1bml0IHRlc3RpbmcgdGhlIHJ1bnRpbWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FsbERPTVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FsbERPTVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Yjc0MjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BbGxET01UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDUsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQWxsRE9NVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCQotLy8JcHJpdmF0ZSBSZW5kZXJlckZhY3RvcnkgZGVmYXVsdFJlbmRlcmVyRmFjdG9yeTsKLQotLy8gICAgcHVibGljIEFsbERPTVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0vLwkJc3VwZXIobmFtZSk7Ci0vLwl9Ci0JCi0vLwlwdWJsaWMgQWxsRE9NVGVzdHMoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSByZikgewotLy8JCXN1cGVyKG5hbWUpOwotLy8JCXRoaXMuZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9IHJmOwotLy8JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiQWxsIERPTSBUZXN0cyBmb3IgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0Iik7Ci0JCS8vJEpVbml0LUJFR0lOJAotCQlzdWl0ZS5hZGRUZXN0KEFwcENsaWVudEVNRkVkaXRUZXN0LnN1aXRlKEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChBcHBDbGllbnRFTUZUZXN0LnN1aXRlKEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChFYXJFTUZFZGl0VGVzdC5zdWl0ZShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRWFyRU1GVGVzdC5zdWl0ZShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7IC8vCi0JCXN1aXRlLmFkZFRlc3QoRWpiRU1GRWRpdFRlc3Quc3VpdGUoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCQlzdWl0ZS5hZGRUZXN0KEVqYkVNRlRlc3Quc3VpdGUoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCQlzdWl0ZS5hZGRUZXN0KFJhckVNRkVkaXRUZXN0LnN1aXRlKEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChSYXJFTUZUZXN0LnN1aXRlKEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChXYXJFTUZFZGl0VGVzdC5zdWl0ZShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCXN1aXRlLmFkZFRlc3QoV2FyRU1GVGVzdC5zdWl0ZShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCXN1aXRlLmFkZFRlc3QoV2ViU2VydmljZXNFTUZUZXN0LnN1aXRlKEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJLy8kSlVuaXQtRU5EJAotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCSBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5tYWluKG5ldyBTdHJpbmdbXSB7IEFsbERPTVRlc3RzLmNsYXNzLmdldE5hbWUoKSB9KTsKLQl9CQotCQotLy8JcHVibGljIHZvaWQgdGVzdFN3aXRjaFJlbmRlcmVyKCkgewotLy8JCVJlbmRlcmVyRmFjdG9yeS5zZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpOwotLy8JCi0vLwl9Ci0vLwotLy8JcHVibGljIHZvaWQgdGVzdFN3aXRjaFJlbmRlcmVyQmFjaygpIHsKLS8vCQlSZW5kZXJlckZhY3Rvcnkuc2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeShkZWZhdWx0UmVuZGVyZXJGYWN0b3J5KTsKLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BbGxTQVhUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BbGxTQVhUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTlmNjZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsU0FYVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCA1LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMlNBWFJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFsbFNBWFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlewotCi0vLwlwcml2YXRlIFJlbmRlcmVyRmFjdG9yeSBkZWZhdWx0UmVuZGVyZXJGYWN0b3J5OwotLy8JCi0vLwlBbGxUZXN0cyB0ZXN0cyA9IG5ldyBBbGxUZXN0cygpOyAvLyBmb3JjZSB0aGUgY2xhc3MgdG8gbG9hZCBpZiB0aGlzIHRlc3QgaXMgbG9hZGVkIAotLy8gIAotLy8JcHVibGljIEFsbFNBWFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0vLwkJc3VwZXIobmFtZSk7Ci0vLwl9IAotLy8KLS8vCXB1YmxpYyBBbGxTQVhUZXN0cyhTdHJpbmcgbmFtZSwgUmVuZGVyZXJGYWN0b3J5IHJmKSB7Ci0vLwkJc3VwZXIobmFtZSk7Ci0vLwkJdGhpcy5kZWZhdWx0UmVuZGVyZXJGYWN0b3J5ID0gcmY7Ci0vLwl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJBbGwgU0FYIFRlc3RzIGZvciBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QiKTsKLQkJLy8kSlVuaXQtQkVHSU4kCi0JCXN1aXRlLmFkZFRlc3QoQXBwQ2xpZW50RU1GRWRpdFRlc3Quc3VpdGUoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCQlzdWl0ZS5hZGRUZXN0KEFwcENsaWVudEVNRlRlc3Quc3VpdGUoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCQlzdWl0ZS5hZGRUZXN0KEVhckVNRkVkaXRUZXN0LnN1aXRlKEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChFYXJFTUZUZXN0LnN1aXRlKEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsgLy8KLQkJc3VpdGUuYWRkVGVzdChFamJFTUZFZGl0VGVzdC5zdWl0ZShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRWpiRU1GVGVzdC5zdWl0ZShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCXN1aXRlLmFkZFRlc3QoUmFyRU1GRWRpdFRlc3Quc3VpdGUoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCQlzdWl0ZS5hZGRUZXN0KFJhckVNRlRlc3Quc3VpdGUoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCQlzdWl0ZS5hZGRUZXN0KFdhckVNRkVkaXRUZXN0LnN1aXRlKEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChXYXJFTUZUZXN0LnN1aXRlKEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChXZWJTZXJ2aWNlc0VNRlRlc3Quc3VpdGUoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLm1haW4obmV3IFN0cmluZ1tdIHsgQWxsU0FYVGVzdHMuY2xhc3MuZ2V0TmFtZSgpIH0pOwotCX0JCi0JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoUmVuZGVyZXIoKSB7Ci0vLwkJUmVuZGVyZXJGYWN0b3J5LnNldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSk7IAotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoUmVuZGVyZXJCYWNrKCkgewotLy8JCVJlbmRlcmVyRmFjdG9yeS5zZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KGRlZmF1bHRSZW5kZXJlckZhY3RvcnkpOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BbGxUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTMwMDhiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBDb21tb24gQXJjaGl2ZSBhbmQgRU1GIFRlc3RzIik7Ci0gICAgICAgIC8vJEpVbml0LUJFR0lOJAotCi0JCXN1aXRlLmFkZFRlc3QoQWxsRE9NVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQWxsU0FYVGVzdHMuc3VpdGUoKSk7Ci0KLQkJLy8kSlVuaXQtRU5EJAotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCWp1bml0LnRleHR1aS5UZXN0UnVubmVyLm1haW4obmV3IFN0cmluZ1tdIHsgQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpIH0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BcHBDbGllbnRFTUZFZGl0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BcHBDbGllbnRFTUZFZGl0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODY3OWQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQXBwQ2xpZW50RU1GRWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRFTUZFZGl0VGVzdCBleHRlbmRzIEdlbmVyYWxFTUZFZGl0aW5nVGVzdCB7Ci0gICAgRUFSRmlsZSBlYXJGaWxlOwotICAgIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlOwotCi0gICAgcHVibGljIEFwcENsaWVudEVNRkVkaXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQXBwQ2xpZW50RU1GRWRpdFRlc3QoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgCXN1cGVyKG5hbWUsIGZhY3RvcnkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuQXBwQ2xpZW50RU1GRWRpdFRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBcHBDbGllbnRFTUZFZGl0VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBBcHBDbGllbnRFTUZFZGl0VGVzdCgidGVzdEFwcGxpY2F0aW9uQ2xpZW50RWRpdCIsIGZhY3RvcnkpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25DbGllbnRFZGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldEFwcENsaWVudCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjEuMyIsIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRWZXJzaW9uKCkpOwotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UgREQgPSAoQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSkgYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlzZXRNb2R1bGVUeXBlKEFQUF9DTElFTlQpOwotICAgICAgICBlZGl0Um9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIFN0cmluZyBvdXQgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9FTUZNb2RlbENyZWF0aW9uVGVzdHMvRWRpdEFwcEVBUiI7Ci0gICAgICAgIGFwcENsaWVudEZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgYXBwQ2xpZW50RmlsZS5jbG9zZSgpOwotCi0gICAgICAgIC8vQ29tcGFyZQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3RzL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArIG91dCArICIvQXBwQ2xpZW50Zm9vL01FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLSAgICAgICAgLy9jb21wYXJlQ29udGVudHMoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldEFwcENsaWVudCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9mb29BUFAvIjsKLSAgICAgICAgYXBwQ2xpZW50RmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShpbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BcHBDbGllbnRFTUZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FwcENsaWVudEVNRlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNiODg1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FwcENsaWVudEVNRlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRFTUZUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0IHsKLSAgICBFQVJGaWxlIGVhckZpbGU7Ci0gICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlOwotCUVBUkZpbGUgZWFyRmlsZTE0OwotCUFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlMTQ7Ci0KLSAgICBwdWJsaWMgQXBwQ2xpZW50RU1GVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEFwcENsaWVudEVNRlRlc3QoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgCXN1cGVyKG5hbWUsIGZhY3RvcnkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuQXBwQ2xpZW50RU1GVGVzdCIsICItbm9sb2FkaW5nIiB9OwotICAgICAgICBUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQXBwQ2xpZW50RU1GVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBBcHBDbGllbnRFTUZUZXN0KCJ0ZXN0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uIiwgZmFjdG9yeSkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBBcHBDbGllbnRFTUZUZXN0KCJ0ZXN0MTRBcHBsaWNhdGlvbkNsaWVudFBvcHVsYXRpb24iLCBmYWN0b3J5KSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLSAgICAgICAgY3JlYXRlRUFSKCk7Ci0gICAgICAgIGNyZWF0ZUFwcENsaWVudCgpOwotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UgREQgPSAoQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSkgYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0gICAgICAgIHNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotICAgICAgICBzZXRNb2R1bGVUeXBlKEFQUF9DTElFTlQpOwotICAgICAgICBwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RBcHBFQVIiOwotICAgICAgICBlYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVhckZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUKLSAgICAgICAgU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiRU1GVGVzdE5vSUQvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdEFwcEVBUi9mb29BUFAvTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0MTRBcHBsaWNhdGlvbkNsaWVudFBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJCWNyZWF0ZUVBUigpOwotCQkJY3JlYXRlQXBwQ2xpZW50KCk7Ci0KLQkJCUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UgREQgPSAoQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSkgYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCQlzZXRNb2R1bGVUeXBlKEFQUF9DTElFTlQpOwotCQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0KLQkJCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEFwcEVBUjE0IjsKLQkJCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJCWVhckZpbGUuY2xvc2UoKTsKLQotCQkJZ2V0QXBwMTRDbGllbnQoKTsKLQkJCWFzc2VydEVxdWFscygiMS40IiwgYXBwQ2xpZW50RmlsZTE0LmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLQkJCW91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0QXBwRUFSMTRfMiI7Ci0JCQlhcHBDbGllbnRGaWxlMTQuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJCWFwcENsaWVudEZpbGUxNC5jbG9zZSgpOwotCQkJCi0JCQkvL0NvbXBhcmUKLQkJCVN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLQkJCVN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdEFwcEVBUjE0L2Zvb0FQUC9NRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIjsKLQkJCVN0cmluZyBzZWNvbmREZXBsb3ltZW50RGVzVVJJID0gb3V0ICsgIi9NRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIjsKLQkJCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBzZWNvbmREZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQXBwQ2xpZW50KCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFwcENsaWVudEZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUluaXRpYWxpemVkKCJmb29BUFAiKTsKLSAgICAgICAgYXBwQ2xpZW50RmlsZSA9IChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIGVhckZpbGUuYWRkQ29weShhcHBDbGllbnRGaWxlKTsKLSAgICAgICAgYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLnNldERpc3BsYXlOYW1lKCJmb29BUFAiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhcHBDbGllbnRGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlRUFSKCkgewotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9ICJUZXN0LmVhciI7Ci0gICAgICAgIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChlYXJOYW1lKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotICAgIAotICAgIAotCXB1YmxpYyB2b2lkIGdldEFwcDE0Q2xpZW50KCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1Rlc3RBcHBFQVIxNC9mb29BUFAiOwotCQlhcHBDbGllbnRGaWxlMTQgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoaW4pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvRWFyRU1GRWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvRWFyRU1GRWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkNTc5MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VhckVNRkVkaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgRWFyRU1GRWRpdFRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QgewotICAgIEVBUkZpbGUgZWFyRmlsZTsKLSAgICBpbnQgY3JlYXRlZE1vZHVsZXMgPSAwOwotCi0gICAgcHJpdmF0ZSBpbnQgTlVNX01PRFVMRVMgPSA0OwotCi0gICAgcHVibGljIEVhckVNRkVkaXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRWFyRU1GRWRpdFRlc3QoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgCXN1cGVyKG5hbWUsIGZhY3RvcnkpOwotICAgIH0KLQkKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuRWFyRU1GRWRpdFRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZShSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEVhckVNRkVkaXRUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IEVhckVNRkVkaXRUZXN0KCJ0ZXN0RUFSRWRpdCIsIGZhY3RvcnkpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFQVJFZGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldEVBUigpOwotCi0JCWFzc2VydEVxdWFscygiMS4yIiwgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFZlcnNpb24oKSk7Ci0KLSAgICAgICAgQXBwbGljYXRpb25SZXNvdXJjZSBERCA9IChBcHBsaWNhdGlvblJlc291cmNlKSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXNldE1vZHVsZVR5cGUoQVBQSUNBVElPTik7IAotICAgICAgICBlZGl0Um9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgb3V0ID0gY3VyRGlyICsidGVzdE91dHB1dC9FZGl0T3V0cHV0L0VNRk1vZGVsQ3JlYXRpb25UZXN0cy9FZGl0RUFSIjsKLSAgICAgICAgZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLSAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3RzL2FwcGxpY2F0aW9uLnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgb3V0ICsgIi9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiOwotICAgICAgICAvL2NvbXBhcmVDb250ZW50cyhjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2V0RUFSKCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi8iOwotICAgICAgICBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShpbik7Ci0gICAgICAgIGFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiTW9kdWxlIikpIHsKLQkJCWNyZWF0ZWRNb2R1bGVzKys7Ci0JCQlzd2l0Y2ggKGNyZWF0ZWRNb2R1bGVzKSB7Ci0JCQkJY2FzZSAoMSkgOgotCQkJCQlyZXR1cm4gY3JlYXRlSmF2YU1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQljYXNlICgyKSA6Ci0JCQkJCXJldHVybiBjcmVhdGVFSkJNb2R1bGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJY2FzZSAoMykgOgotCQkJCQlyZXR1cm4gY3JlYXRlV2ViTW9kdWxlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWNhc2UgKDQpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZUNvbm5ldG9yTW9kdWxlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gY3JlYXRlSmF2YU1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVDb25uZXRvck1vZHVsZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChBcHBsaWNhdGlvbkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVDb25uZWN0b3JNb2R1bGUoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlV2ViTW9kdWxlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEFwcGxpY2F0aW9uRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZVdlYk1vZHVsZSgpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVFSkJNb2R1bGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoQXBwbGljYXRpb25GYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlRWpiTW9kdWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoQXBwbGljYXRpb25GYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlSmF2YUNsaWVudE1vZHVsZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0U2hhcmVkT2JqZWN0QnlUeXBlKEVPYmplY3Qgb3duZXIsIEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygibW9kdWxlIikpCi0JCQlyZXR1cm4gY3JlYXRlSmF2YU1vZHVsZUluc3RhbmNlKChFQ2xhc3MpIHJlZi5nZXRFVHlwZSgpKTsKLQkJcmV0dXJuIHN1cGVyLmdldFNoYXJlZE9iamVjdEJ5VHlwZShvd25lciwgcmVmKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlcHRoRm9yQXR0cmlidXRlKEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygibW9kdWxlcyIpKQotCQkJcmV0dXJuIE5VTV9NT0RVTEVTOwotCQlyZXR1cm4gc3VwZXIuZ2V0RGVwdGhGb3JBdHRyaWJ1dGUocmVmKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VhckVNRlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvRWFyRU1GVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzMzZDg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvRWFyRU1GVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBFYXJFTUZUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0IHsKLSAgICBwcm90ZWN0ZWQgRUFSRmlsZSBlYXJGaWxlOwotICAgIGludCBjcmVhdGVkTW9kdWxlcyA9IDA7Ci0KLSAgICBwcml2YXRlIGludCBOVU1fTU9EVUxFUyA9IDU7Ci0KLSAgICBwdWJsaWMgRWFyRU1GVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEVhckVNRlRlc3QoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgCXN1cGVyKG5hbWUsIGZhY3RvcnkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuRWFyRU1GVGVzdCIsICItbm9sb2FkaW5nIiB9OwotICAgICAgICBUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoRWFyRU1GVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBFYXJFTUZUZXN0KCJ0ZXN0RUFSUG9wdWxhdGlvbiIsIGZhY3RvcnkpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRWFyRU1GVGVzdCgidGVzdDE0RUFSUG9wdWxhdGlvbiIsIGZhY3RvcnkpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFQVJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLSAgICAgICAgY3JlYXRlRUFSKCk7Ci0gICAgICAgIC8vY3JlYXRlQXBwQ2xpZW50KCk7Ci0KLSAgICAgICAgQXBwbGljYXRpb25SZXNvdXJjZSBERCA9IChBcHBsaWNhdGlvblJlc291cmNlKSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShBUFBMSUNBVElPTik7Ci0gICAgICAgIHBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEVBUiI7Ci0gICAgICAgIGVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotCi0gICAgICAgIC8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0gICAgICAgIFN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdEVBUi9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIHRlc3QxNEVBUlBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJLy9jcmVhdGVBcHBDbGllbnQoKTsKLQotCQlBcHBsaWNhdGlvblJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uUmVzb3VyY2UpIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKEFQUExJQ0FUSU9OKTsKLQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0KLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0RUFSMTQiOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVhckZpbGUuY2xvc2UoKTsKLQotCQlnZXRFQVIoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjQiLCBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLQkJb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFQVIxNF8yIjsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQkKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JCS8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0JCVN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLQkJU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gb3V0ICsgIi9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiOwotCQlTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RFQVIxNC9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0JfQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUVBUigpIHsKLSAgICAgICAgU3RyaW5nIGVhck5hbWUgPSAiVGVzdC5lYXIiOwotICAgICAgICBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoZWFyTmFtZSk7Ci0gICAgICAgIGFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIGdldEVBUigpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpbiA9QXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFQVIxNCI7Ci0JCWVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGluKTsKLQkJYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotCi0gICAgcHVibGljIEVPYmplY3QgY3JlYXRlSW5zdGFuY2UoRVJlZmVyZW5jZSByZWYsIEVPYmplY3QgZU9iamVjdCkgewotCQlFQ2xhc3MgZUNsYXNzaWZpZXIgPSAoRUNsYXNzKXJlZi5nZXRFVHlwZSgpOwotICAgICAgICBpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiTW9kdWxlIikpIHsKLSAgICAgICAgICAgIGNyZWF0ZWRNb2R1bGVzKys7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNyZWF0ZWRNb2R1bGVzKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoMSkgOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSmF2YU1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgICAgICAgICBjYXNlICgyKSA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVFSkJNb2R1bGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgICAgICAgICAgY2FzZSAoMykgOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlV2ViTW9kdWxlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgICAgIGNhc2UgKDQpIDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbm5ldG9yTW9kdWxlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSmF2YU1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UocmVmLGVPYmplY3QpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVDb25uZXRvck1vZHVsZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotICAgICAgICByZXR1cm4gKChBcHBsaWNhdGlvbkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVDb25uZWN0b3JNb2R1bGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVPYmplY3QgY3JlYXRlV2ViTW9kdWxlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEFwcGxpY2F0aW9uRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZVdlYk1vZHVsZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVFSkJNb2R1bGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgcmV0dXJuICgoQXBwbGljYXRpb25GYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlRWpiTW9kdWxlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgcmV0dXJuICgoQXBwbGljYXRpb25GYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlSmF2YUNsaWVudE1vZHVsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0U2hhcmVkT2JqZWN0QnlUeXBlKEVPYmplY3Qgb3duZXIsIEVSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygibW9kdWxlIikpCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlSmF2YU1vZHVsZUluc3RhbmNlKChFQ2xhc3MpIHJlZi5nZXRFVHlwZSgpKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFNoYXJlZE9iamVjdEJ5VHlwZShvd25lciwgcmVmKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERlcHRoRm9yQXR0cmlidXRlKEVTdHJ1Y3R1cmFsRmVhdHVyZSByZWYpIHsKLSAgICAgICAgaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJtb2R1bGVzIikpCi0gICAgICAgICAgICByZXR1cm4gTlVNX01PRFVMRVM7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXB0aEZvckF0dHJpYnV0ZShyZWYpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VqYkVNRkVkaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VqYkVNRkVkaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMGNmMWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FamJFTUZFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQZXJtaXNzaW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeU1ldGhvZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMlNBWFJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEVqYkVNRkVkaXRUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRkVkaXRpbmdUZXN0IHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRWpiUGFja2FnZSBFSkJfUEtHID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JRUFSRmlsZSBlYXJGaWxlOwotCUVKQkphckZpbGUgZWpiRmlsZTsKLQlFT2JqZWN0IG1lc0JlYW4sIGVudGl0eUJlYW47Ci0JU2VjdXJpdHlJZGVudGl0eSBzZWNJRDsKLQlSb2xlU291cmNlIHJvbGVTb3VyY2U7Ci0JaW50IE5VTV9CRUFOUyA9IDEwOwotCWZpbmFsIGludCBOVU1fUkVMQVRJT05fUk9MRVMgPSAyOwotCWludCBjcmVhdGVkQmVhbnMgPSAwOwotCWludCBjcmVhdGVkU2VjUm9sZXMgPSAwOwotCXByb3RlY3RlZCBpbnQgY3JlYXRlZFNlY3VyaXR5SWRlbnRpdGllcyA9IDA7Ci0JYm9vbGVhbiBtcEZsYWcgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBFamJFTUZFZGl0VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEVqYkVNRkVkaXRUZXN0KFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgIAlzdXBlcihuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJanVuaXQudGV4dHVpLlRlc3RSdW5uZXIubWFpbihuZXcgU3RyaW5nW10geyBFamJFTUZFZGl0VGVzdC5jbGFzcy5nZXROYW1lKCkgfSk7IAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShFamJFTUZFZGl0VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBFamJFTUZFZGl0VGVzdCgidGVzdEVKQkphckVkaXQiLGZhY3RvcnkpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgRWpiRU1GRWRpdFRlc3QoInRlc3RXQ0NNSmFyIixmYWN0b3J5KSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RUpCSmFyRWRpdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXRFSkIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRWZXJzaW9uKCkpOwotICAgICAgICBFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlzZXRNb2R1bGVUeXBlKEVKQik7IAotICAgICAgICBlZGl0Um9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIFN0cmluZyBvdXQgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9FTUZNb2RlbENyZWF0aW9uVGVzdHMvRWRpdEVqYkVBUiI7Ci0gICAgICAgIGVqYkZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgZWpiRmlsZS5jbG9zZSgpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0gICAgICAgIAotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBudWxsOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLSAgICAgICAgaWYgKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkgaW5zdGFuY2VvZiBFTUYyU0FYUmVuZGVyZXJGYWN0b3J5KXsKLSAgICAgICAgICAgIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3RzL2VqYi1qYXIyLTBzYXgueG1sIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0cy9lamItamFyMi0wLnhtbCI7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJGaWxlOiAiICsgZXhhbXBsZURlcGxveW1lbnREZXNVUkkpOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IG91dCArICIvTUVUQS1JTkYvZWpiLWphci54bWwiOwotICAgICAgICAvL1RPRE8gUmVtb3ZlIGFmdGVyIHdlYnNlcnZpY2VzIHhzZCBpcyByZXN0b3JlZAotICAgICAgICAvL2NvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkksICIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V0NDTUphcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICIuLi90ZXN0RGF0YS9lamIiOwotCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0SXNSZWFkT25seSh0cnVlKTsKLQkJZWpiRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVKQkphckZpbGUob3B0aW9ucywgaW4pOyAKLQkJIAotICAgICAgICBFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCURELmdldFJvb3RPYmplY3QoKTsKLQotICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvdGVzdE91dHB1dCI7Ci0gICAgICAgIGVqYkZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgZWpiRmlsZS5jbG9zZSgpOwotCi0gICAgICAgIC8qREQuc2F2ZShTeXN0ZW0ub3V0LCBudWxsKTsgKi8KLSAgICAgICAgCi0gICAgICAgIC8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0gICAgICAgIFN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gaW4gKyAiL01FVEEtSU5GL2VqYi1qYXIueG1sIjsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBvdXQgKyAiL01FVEEtSU5GL2VqYi1qYXIueG1sIjsKLQotICAgICAgICBjb21wYXJlQ29udGVudHMoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXF1aXJlcyBqMmVlLmNvcmUud3MuZXh0IHRvIGJlIG9uIHRoZSBjbGFzc3BhdGgKLSAgICAgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24KLSAgICAgKi8KLS8qICAgIHB1YmxpYyB2b2lkIHRlc3RXQ0NNUHJvdmlkZWRDYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vd2NjbS9lYXIiOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSBudWxsOwotICAgICAgICB0cnkgewotIAotICAgICAgICAgICAgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCk7Ci0gICAgICAgICAgICBBcmNoaXZlT3B0aW9ucyBvcHQgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdC5zZXRJc1JlYWRPbmx5ICh0cnVlKTsKLSAgICAgICAgICAgIG9wdC5zZXRVc2VKYXZhUmVmbGVjdGlvbiAoZmFsc2UpOwotIAotICAgICAgICAgICAgZWFyRmlsZSA9IGZhY3Rvcnkub3BlbkVBUkZpbGUgKG9wdCwgaW4pOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuICgidXJpOiAiICsgZWFyRmlsZS5nZXRVUkkoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCJvcmlndXJpOiAiICsgZWFyRmlsZS5nZXRPcmlnaW5hbFVSSSgpKTsKLSAKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgQXBwbGljYXRpb25CaW5kaW5nIGFwcEJpbmRpbmdzID0gZWFyRmlsZS5nZXRCaW5kaW5ncygpOwotICAgICAgICAgICAgQXBwbGljYXRpb25FeHRlbnNpb24gYXBwRXh0ZW5zaW9ucyA9IGVhckZpbGUuZ2V0RXh0ZW5zaW9ucygpOwotIAotCi0gICAgICAgIEl0ZXJhdG9yIHJzID0gZWFyRmlsZS5nZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocnMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXNvdXJjZSByID0gKFJlc291cmNlKSBycy5uZXh0KCk7Ci0gCi0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0gKHIuZ2V0VVJJKCkudG9TdHJpbmcoKS5yZXBsYWNlKCcvJywgJy0nKSk7Ci0gICAgICAgICAgICByLnNhdmUgKGZvLCBuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgICAgIGZvLmZsdXNoKCk7Ci0gICAgICAgICAgICBmby5jbG9zZSgpOwotICAgICAgICB9Ci0gCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT08RG9uZSBBcHAgREQ+PT09PT09PT09PSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuICgiIik7Ci0gCi0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZihlYXJGaWxlICE9IG51bGwpCi0gICAgICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgIH0qLwotCi0gICAgcHVibGljIHZvaWQgZ2V0RUpCKCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJsb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS8iOwotCQkgZWpiRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVKQkphckZpbGUoaW4pOwotICAgICAgICBhc3NlcnRUcnVlKGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLSAgICB9Ci0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIkVudGVycHJpc2VCZWFuIikpIHsKLQkJCWNyZWF0ZWRCZWFucysrOwotCQkJc3dpdGNoIChjcmVhdGVkQmVhbnMpIHsKLQkJCQljYXNlICgzKSA6Ci0JCQkJCXJldHVybiBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5SW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWNhc2UgKDcpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VCZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWNhc2UgKDQpIDoKLQkJCQljYXNlICg4KSA6Ci0JCQkJCXJldHVybiBjcmVhdGVTZXNzaW9uQmVhbkluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGNyZWF0ZUVudGl0eUJlYW5JbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiU2VjdXJpdHlJZGVudGl0eSIpKQotCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5SWRlbnRpdGl5SW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQllbHNlIGlmIChlQ2xhc3NpZmllci5nZXROYW1lKCkuZXF1YWxzKCJSb2xlU291cmNlIikpCi0JCQlyZXR1cm4gY3JlYXRlUm9sZVNvdXJjZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJZWxzZSBpZiAoZUNsYXNzaWZpZXIgPT0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQXR0cmlidXRlKCkpCi0JCQlyZXR1cm4gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVTZWN1cml0eUlkZW50aXRpeUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQkvKiBBbHRlcm5hdGUgdHlwZXMgKi8KLQkJY3JlYXRlZFNlY1JvbGVzKys7Ci0JCWlmICgoY3JlYXRlZFNlY1JvbGVzICYgMSkgPT0gMCkKLQkJCXJldHVybiBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpOwotCQllbHNlCi0JCQlyZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVSb2xlU291cmNlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVSb2xlU291cmNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZU1lc3NhZ2VCZWFuSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVNZXNzYWdlRHJpdmVuKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVNlc3Npb25CZWFuSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVTZXNzaW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUVudGl0eUJlYW5JbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUVudGl0eSgpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5SW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3QuR2VuZXJhbEVNRlRlc3QjZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoRVJlZmVyZW5jZSkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlcHRoRm9yQXR0cmlidXRlKEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygiZW50ZXJwcmlzZUJlYW5zIikpCi0JCQlyZXR1cm4gTlVNX0JFQU5TOwotCQllbHNlIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygiZW50aXR5QmVhbnMiKSkKLQkJCXJldHVybiBOVU1fQkVBTlM7Ci0JCWVsc2UgaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJyZWxhdGlvbnNoaXBSb2xlcyIpKQotCQkJcmV0dXJuIE5VTV9SRUxBVElPTl9ST0xFUzsKLQkJcmV0dXJuIHN1cGVyLmdldERlcHRoRm9yQXR0cmlidXRlKHJlZik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QuR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0I3BvcHVsYXRlRmVhdHVyZXMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JKi8KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZUZlYXR1cmVzKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdC5lQ2xhc3MoKSA9PSBFSkJfUEtHLmdldENNUEF0dHJpYnV0ZSgpKSB7Ci0JCQkoKENNUEF0dHJpYnV0ZSkgZU9iamVjdCkuc2V0TmFtZSgoU3RyaW5nKSBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZShFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpLGVPYmplY3QpKTsKLQkJCSgoQ01QQXR0cmlidXRlKSBlT2JqZWN0KS5zZXRFVHlwZSgoRUNsYXNzaWZpZXIpIGNyZWF0ZUphdmFDbGFzc1Byb3h5KG51bGwpKTsKLQkJfSBlbHNlCi0JCQlzdXBlci5lZGl0RmVhdHVyZXMoZU9iamVjdCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNwb3B1bGF0ZUF0dHJpYnV0ZXMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVBdHRyaWJ1dGVzKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIFF1ZXJ5TWV0aG9kSW1wbCkgewotCQkJTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRUF0dHJpYnV0ZSBhdHQgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQlpZiAoYXR0LmdldE5hbWUoKS5lcXVhbHMoInBhcm1zIikgJiYgdmFsdWUgPT0gbnVsbCl7Ci0JCQkJCXZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQl9Ci0JCQkJaWYgKGF0dC5pc0NoYW5nZWFibGUoKSkKLQkJCQkJZU9iamVjdC5lU2V0KGF0dCwgdmFsdWUpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQZXJtaXNzaW9uSW1wbCkgewotCQkJTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRUF0dHJpYnV0ZSBhdHQgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQkJaWYoYXR0LmdldE5hbWUoKS5lcXVhbHMoInVuY2hlY2tlZCIpICYmIG1wRmxhZyl7Ci0JCQkJCWNvbnRpbnVlOwkJCQkJCi0JCQkJfQkKLQkJCQkKLQkJCQlPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpCi0JCQkJCWVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLQkJCX0gCi0JCQltcEZsYWcgPSAhbXBGbGFnOwotCQl9IGVsc2UKLQkJCXN1cGVyLmVkaXRBdHRyaWJ1dGVzKGVPYmplY3QpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLQkJaWYoZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb25JbXBsICYmIHJlZi5nZXROYW1lKCkuZXF1YWxzKCJyb2xlcyIpKXsKLQkJCW1wRmxhZyA9ICFtcEZsYWc7Ci0JCQkvL2lmIG1ldGhvZCBwZXJtaXNzaW9uIHVuY2hlY2tlZCBpZ25vcmUgcm9sZXMKLQkJCWlmKCFtcEZsYWcpewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5wb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShlT2JqZWN0LCByZWYpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZWFyRmlsZSA9IG51bGw7Ci0JCWVqYkZpbGUgPSBudWxsOwotCQltZXNCZWFuID0gbnVsbDsKLQkJZW50aXR5QmVhbiA9IG51bGw7Ci0JCXNlY0lEICA9IG51bGw7Ci0JCXJvbGVTb3VyY2UgPSBudWxsOwotCi0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FamJFTUZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VqYkVNRlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiZmZjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VqYkVNRlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5TWV0aG9kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEVqYkVNRlRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QgewotCXN0YXRpYyB7Ci0JCS8vVGVtcG9yYXJ5IHdvcmthcm91bmQgdG8ga2VlcCBwYWNrYWdlcyBmcm9tIGJlaW5nIHJlZ2lzdGVyZWQgdHdpY2UKLQkJSjJFRUluaXQuaW5pdCgpOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVqYlBhY2thZ2UgRUpCX1BLRyA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCUVBUkZpbGUgZWFyRmlsZTsKLQlwcm90ZWN0ZWQgRUpCSmFyRmlsZSBlamJGaWxlOwotCUVPYmplY3QgbWVzQmVhbiwgZW50aXR5QmVhbjsKLQlTZWN1cml0eUlkZW50aXR5IHNlY0lEOwotCVJvbGVTb3VyY2Ugcm9sZVNvdXJjZTsKLQlpbnQgTlVNX0JFQU5TID0gMTA7Ci0JZmluYWwgaW50IE5VTV9SRUxBVElPTl9ST0xFUyA9IDI7Ci0JaW50IGNyZWF0ZWRCZWFucyA9IDA7Ci0JaW50IGNyZWF0ZWRTZWNSb2xlcyA9IDA7Ci0JcHJvdGVjdGVkIGludCBjcmVhdGVkU2VjdXJpdHlJZGVudGl0aWVzID0gMDsKLQlib29sZWFuIG1wRmxhZyA9IGZhbHNlOwotCWJvb2xlYW4gZmlyc3RSZXR1cm5UeXBlTWFwcGluZyA9IHRydWU7Ci0JCi0JcHVibGljIEVqYkVNRlRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotICAgIHB1YmxpYyBFamJFTUZUZXN0KFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgIAlzdXBlcihuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJanVuaXQudGV4dHVpLlRlc3RSdW5uZXIubWFpbihuZXcgU3RyaW5nW10geyBFamJFTUZUZXN0LmNsYXNzLmdldE5hbWUoKX0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShFamJFTUZUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVqYkVNRlRlc3QoInRlc3RFSkJKYXJQb3B1bGF0aW9uIixmYWN0b3J5KSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVqYkVNRlRlc3QoInRlc3QxNEVKQkphclBvcHVsYXRpb24iLGZhY3RvcnkpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFSkJKYXJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZUVKQigpOwotCi0JCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShFSkIpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFSkJFQVIiOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVhckZpbGUuY2xvc2UoKTsKLQkJc2V0RXF1aXZhbGVudExpbmVzKGdldEVxdWl2YWxlbnRMaW5lc01hcCgpKTsKLQkJLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLQkJU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotCQlTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiL0VNRlRlc3ROb0lEL2VqYi1qYXIueG1sIjsKLQkJU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9UZXN0RUpCRUFSL2Zvb0VKQi9NRVRBLUlORi9lamItamFyLnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLS8vCQlERC51bmxvYWQoKTsKLS8vCQlERC5sb2FkKG5ldyBIYXNoTWFwKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MTRFSkJKYXJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZUVKQigpOwotCi0JCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShFSkIpOwotCQkvL3NldEdlbmVyYWxEZXB0aCgyKTsKLQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEVKQkVBUjE0IjsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0JCQotCQlzZXRFcXVpdmFsZW50TGluZXMoZ2V0RXF1aXZhbGVudExpbmVzTWFwKCkpOwotCQlnZXRFSkIoKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLCBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLQkJb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFSkJFQVIxNF8yIjsKLQkJZWpiRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllamJGaWxlLmNsb3NlKCk7Ci0KLQkJLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLQkJU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotCQlTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBvdXQgKyAiL01FVEEtSU5GL2VqYi1qYXIueG1sIjsKLQkJU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9UZXN0RUpCRUFSMTQvZm9vRUpCL01FVEEtSU5GL2VqYi1qYXIueG1sIjsKLQkJc2V0SWdub3JlQXR0KGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSk7Ci0JCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkksIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNYXAgZ2V0RXF1aXZhbGVudExpbmVzTWFwKCkgewotCQlNYXAgbGluZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlsaW5lcy5wdXQoIjxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPiIsICI8Y2FzY2FkZS1kZWxldGUvPiIpOwotCQlsaW5lcy5wdXQoIjxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4iLCI8bWV0aG9kLXBhcmFtcy8+Iik7Ci0JCWxpbmVzLnB1dCgiPHVuY2hlY2tlZD48L3VuY2hlY2tlZD4iLCI8dW5jaGVja2VkLz4iKTsgCi0JCWxpbmVzLnB1dCgiPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PiIsIjx1c2UtY2FsbGVyLWlkZW50aXR5Lz4iKTsKLQkJcmV0dXJuIGxpbmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGdldEVKQigpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFSkJFQVIxNC9mb29FSkIiOwotCQllamJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUpCSmFyRmlsZShpbik7Ci0JCWFzc2VydFRydWUoZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUVKQigpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQllamJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFSkJKYXJGaWxlSW5pdGlhbGl6ZWQoImZvb0VKQiIpOwotCQllamJGaWxlID0gKEVKQkphckZpbGUpIGVhckZpbGUuYWRkQ29weShlamJGaWxlKTsKLQkJZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLnNldERpc3BsYXlOYW1lKCJmb29FSkIiKTsKLQkJYXNzZXJ0VHJ1ZShlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRUFSKCkgewotCQlTdHJpbmcgZWFyTmFtZSA9ICJUZXN0LmVhciI7Ci0JCWVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChlYXJOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlSW5zdGFuY2UoRVJlZmVyZW5jZSByZWYsIEVPYmplY3QgZU9iamVjdCkgewotCQlFQ2xhc3MgZUNsYXNzaWZpZXIgPSAoRUNsYXNzKXJlZi5nZXRFVHlwZSgpOwotCQlpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiRW50ZXJwcmlzZUJlYW4iKSkgewotCQkJY3JlYXRlZEJlYW5zKys7Ci0JCQlzd2l0Y2ggKGNyZWF0ZWRCZWFucykgewotCQkJCWNhc2UgKDMpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJY2FzZSAoNykgOgotCQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZUJlYW5JbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJY2FzZSAoNCkgOgotCQkJCWNhc2UgKDgpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZVNlc3Npb25CZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gY3JlYXRlRW50aXR5QmVhbkluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlQ2xhc3NpZmllci5nZXROYW1lKCkuZXF1YWxzKCJTZWN1cml0eUlkZW50aXR5IikpCi0JCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlJZGVudGl0aXlJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCWVsc2UgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIlJvbGVTb3VyY2UiKSkKLQkJCXJldHVybiBjcmVhdGVSb2xlU291cmNlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQllbHNlIGlmIChlQ2xhc3NpZmllciA9PSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVBdHRyaWJ1dGUoKSkKLQkJCXJldHVybiBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVJbnN0YW5jZShyZWYsZU9iamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVNlY3VyaXR5SWRlbnRpdGl5SW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCS8qIEFsdGVybmF0ZSB0eXBlcyAqLwotCQljcmVhdGVkU2VjUm9sZXMrKzsKLQkJaWYgKChjcmVhdGVkU2VjUm9sZXMgJiAxKSA9PSAwKQotCQkJcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVzZUNhbGxlcklkZW50aXR5KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVJvbGVTb3VyY2VJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZVJvbGVTb3VyY2UoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlTWVzc2FnZUJlYW5JbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZU1lc3NhZ2VEcml2ZW4oKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlU2Vzc2lvbkJlYW5JbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZVNlc3Npb24oKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlRW50aXR5QmVhbkluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlRW50aXR5KCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdC5HZW5lcmFsRU1GVGVzdCNnZXREZXB0aEZvckF0dHJpYnV0ZShFUmVmZXJlbmNlKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoRVN0cnVjdHVyYWxGZWF0dXJlIHJlZikgewotCQlpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoImVudGVycHJpc2VCZWFucyIpKQotCQkJcmV0dXJuIE5VTV9CRUFOUzsKLQkJZWxzZSBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoImVudGl0eUJlYW5zIikpCi0JCQlyZXR1cm4gTlVNX0JFQU5TOwotCQllbHNlIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygicmVsYXRpb25zaGlwUm9sZXMiKSkKLQkJCXJldHVybiBOVU1fUkVMQVRJT05fUk9MRVM7Ci0JCXJldHVybiBzdXBlci5nZXREZXB0aEZvckF0dHJpYnV0ZShyZWYpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNwb3B1bGF0ZUZlYXR1cmVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSovCi0JcHVibGljIHZvaWQgcG9wdWxhdGVGZWF0dXJlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QuZUNsYXNzKCkgPT0gRUpCX1BLRy5nZXRDTVBBdHRyaWJ1dGUoKSkgewotCQkJKChDTVBBdHRyaWJ1dGUpIGVPYmplY3QpLnNldE5hbWUoKFN0cmluZykgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVBdHRyaWJ1dGUoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSxlT2JqZWN0KSk7Ci0JCQkoKENNUEF0dHJpYnV0ZSkgZU9iamVjdCkuc2V0RVR5cGUoKEVDbGFzc2lmaWVyKSBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUphdmFDbGFzc1Byb3h5KEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVR5cGVkRWxlbWVudF9FVHlwZSgpLGVPYmplY3QpKTsKLQkJfSBlbHNlIGlmIChlT2JqZWN0LmVDbGFzcygpID09IEVKQl9QS0cuZ2V0Q01SRmllbGQoKSkgewotCQkJKChDTVJGaWVsZCkgZU9iamVjdCkuc2V0TmFtZSgoU3RyaW5nKSBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZShFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpLGVPYmplY3QpKTsKLQkJCXBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIEVKQl9QS0cuZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKSk7Ci0JCQlwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShlT2JqZWN0LCBFSkJfUEtHLmdldENNUkZpZWxkX1JvbGUoKSk7CQkKLQkJfSBlbHNlCi0JCQlzdXBlci5wb3B1bGF0ZUZlYXR1cmVzKGVPYmplY3QpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVBdHRyaWJ1dGVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXR0cmlidXRlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBRdWVyeU1ldGhvZEltcGwpIHsKLQkJCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgeyAKLQkJCQlFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCQlpZiAoYXR0LmVxdWFscyhFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfRGVzY3JpcHRpb24oKSkgfHwgYXR0LmVxdWFscyhFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfRW50ZXJwcmlzZUJlYW4oKSkgfHwgYXR0LmVxdWFscyhFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfVHlwZSgpKSApCi0JCQkJCWNvbnRpbnVlOwotCQkJCU9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJaWYgKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJwYXJtcyIpICYmIHZhbHVlID09IG51bGwpewotCQkJCQl2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJfQotCQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpCi0JCQkJCWVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbkltcGwpIHsKLQkJCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJCUVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCWlmKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJ1bmNoZWNrZWQiKSAmJiBtcEZsYWcpewotCQkJCQljb250aW51ZTsJCQkJCQotCQkJCX0JCi0JCQkJCi0JCQkJT2JqZWN0IHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQlpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKQotCQkJCQllT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0JCQl9IAotCQkJbXBGbGFnID0gIW1wRmxhZzsKLQkJfSBlbHNlIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgRUpCUmVsYXRpb25zaGlwUm9sZUltcGwpIHsKLQkJCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCUVBdHRyaWJ1dGUgbGFzdEF0dHIgPSBudWxsOwotCQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJCUVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCWlmIChhdHQuZ2V0TmFtZSgpLmVxdWFscygiY2FzY2FkZURlbGV0ZSIpICYmIChsYXN0QXR0ci5nZXROYW1lKCkuZXF1YWxzKCJtdWx0aXBsaWNpdHkiKSAmJiAhdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoIk1hbnkiKSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpCi0JCQkJCWVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLQkJCQlsYXN0QXR0ciA9IGF0dDsKLQkJfQotCQkJbXBGbGFnID0gIW1wRmxhZzsKLQkJfSBlbHNlCi0JCQlzdXBlci5wb3B1bGF0ZUF0dHJpYnV0ZXMoZU9iamVjdCk7Ci0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmID09IEVKQl9QS0cuZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKSkgewotCQkJc2V0UmVmZXJlbmNlVmFsdWUoZU9iamVjdCwgcmVmLCBKYXZhQ2xhc3NJbXBsLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIGlmKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQZXJtaXNzaW9uICYmIHJlZi5nZXROYW1lKCkuZXF1YWxzKCJyb2xlcyIpKXsKLQkJCS8vaWYgbWV0aG9kIHBlcm1pc3Npb24gdW5jaGVja2VkIGlnbm9yZSByb2xlcwotCQkJaWYobXBGbGFnKXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltcEZsYWcgPSAhbXBGbGFnOwotCQl9Ci0JCXN1cGVyLnBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNjcmVhdGVBdHRyaWJ1dGVWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCS8vZWF0IHRoZSBmaXJzdCByZXR1cm4gdHlwZSBtYXBwaW5nIGJlY2F1c2UgdGhlIG9yZGVyIHdhcyBjaGFuZ2VkLgotCQlpZiAoZmlyc3RSZXR1cm5UeXBlTWFwcGluZyAmJiBhdHQuZXF1YWxzKEVKQl9QS0cuZ2V0UXVlcnlfUmV0dXJuVHlwZU1hcHBpbmcoKSkpewotCQkJc3VwZXIuY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LGVPYmplY3QpOwotCQkJZmlyc3RSZXR1cm5UeXBlTWFwcGluZyA9IGZhbHNlOwotCQl9IGVsc2UgaWYgKGF0dC5lcXVhbHMoRUpCX1BLRy5nZXRFbnRlcnByaXNlQmVhbl9OYW1lKCkpKQotCQkJcmV0dXJuIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlQXR0cmlidXRlKGF0dCxFSkJfUEtHLmdldEVudGl0eSgpKTsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQllYXJGaWxlID0gbnVsbDsKLQkJZWpiRmlsZSA9IG51bGw7Ci0JCW1lc0JlYW4gPSBudWxsOwotCQllbnRpdHlCZWFuID0gbnVsbDsKLQkJc2VjSUQgPSBudWxsOwotCQlyb2xlU291cmNlID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0dlbmVyYWxFTUZFZGl0aW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9HZW5lcmFsRU1GRWRpdGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhMjJkYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0dlbmVyYWxFTUZFZGl0aW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5KMkVFVmVyc2lvbkNoZWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5UZXN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyYWxFTUZFZGl0aW5nVGVzdCBleHRlbmRzIEdlbmVyYWxFTUZUZXN0IHsKLQkvL2lubmVyIGNsYXNzIHRvIGhhbmRsZSBkZWZmZXJlZCBzaGFyZWQgcmVmZXJlbmNlcwotCXByb3RlY3RlZCBjbGFzcyBEZWZlcnJlZFNoYXJlZFJlZmVyZW5jZUFjdGlvbiB7Ci0JCUVPYmplY3Qgb3duZXI7Ci0JCUVSZWZlcmVuY2UgcmVmOwotCi0JCXB1YmxpYyBEZWZlcnJlZFNoYXJlZFJlZmVyZW5jZUFjdGlvbihFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZikgewotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy5yZWYgPSByZWY7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotCQkJT2JqZWN0IHZhbHVlID0gZ2V0U2hhcmVkT2JqZWN0QnlUeXBlKG93bmVyLCByZWYpOwotCQkJc2V0UmVmZXJlbmNlVmFsdWUob3duZXIsIHJlZiwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBlcXVpdmFsZW50TGluZXM7Ci0JcHVibGljIExpc3QgZGVmZXJlZFJlZmVyZW5jZXM7Ci0JcHVibGljIHN0YXRpYyBpbnQgZ2VuRGVwdGggPSA1OwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHNoYXJlZFZhbHVlOwotCXB1YmxpYyBpbnQgY2xhc3NJbmRleCA9IDA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXZDbGFzc1tdOwotCXB1YmxpYyBzdGF0aWMgSGFzaFNldCBpZ25vcmVBdHQ7Ci0KLQlwdWJsaWMgaW50IHZlcnNpb247Ci0JcHVibGljIGludCBtb2R1bGVUeXBlOwotCS8vc3RhdGljIHZlcnNpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzIgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8zID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfNCA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBJQ0FUSU9OID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBfQ0xJRU5UID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUT1IgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVKQiA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCID0gNDsKLQotCXB1YmxpYyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotICAgIHB1YmxpYyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgCXN1cGVyKG5hbWUsIGZhY3RvcnkpOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIGVkaXRSb290KEVPYmplY3QgZU9iamVjdCkgewotCQllZGl0RmVhdHVyZXMoZU9iamVjdCk7Ci0JCS8vaWYgKGRlZmVyZWRSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJLy8JZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZlcmVkUmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotCQkvLwkJKChEZWZlcnJlZFNoYXJlZFJlZmVyZW5jZUFjdGlvbikgZGVmZXJlZFJlZmVyZW5jZXMuZ2V0KGkpKS5wZXJmb3JtQWN0aW9uKCk7Ci0JCS8vCX0KLQkJLy99Ci0JfQotCi0JcHVibGljIHZvaWQgZWRpdEZlYXR1cmVzKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCWVkaXRBdHRyaWJ1dGVzKGVPYmplY3QpOwotCQkJZWRpdFJlZmVyZW5jZXMoZU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0UmVmZXJlbmNlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJTGlzdCByZWZlcmVuY2VzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIHJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJaWYgKCFyZWYuaXNNYW55KCkgJiYgZU9iamVjdC5lR2V0KHJlZikgIT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChyZWYuaXNDb250YWlubWVudCgpKQotCQkJCXBvcHVsYXRlQ29udGFpbm1lbnRSZWZlcmVuY2UoZU9iamVjdCwgcmVmKTsKLQkJCWVsc2UKLQkJCQlwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShlT2JqZWN0LCByZWYpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmLmdldEVUeXBlKCkgPT0gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFDbGFzcygpKQotCQkJc2V0UmVmZXJlbmNlVmFsdWUoZU9iamVjdCwgcmVmLCBjcmVhdGVKYXZhQ2xhc3NQcm94eSgoRUNsYXNzKSByZWYuZ2V0RVR5cGUoKSkpOwotCQllbHNlIHsKLQkJCUVQYWNrYWdlIHBrZyA9IHJlZi5nZXRFVHlwZSgpLmdldEVQYWNrYWdlKCk7Ci0JCQlpZiAocGtnID09IGVPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSB8fCBwa2cgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpIHsKLQkJCQlpZiAoZU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJFQW5ub3RhdGlvbiIpIHx8IGVPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiRUFubm90YXRpb25JbXBsIikgfHwgIUoyRUVWZXJzaW9uQ2hlY2suY2hlY2tSZWZlcmVuY2VWZXJzaW9uKHJlZiwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoZGVmZXJlZFJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCQkJZGVmZXJlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZGVmZXJlZFJlZmVyZW5jZXMuYWRkKG5ldyBEZWZlcnJlZFNoYXJlZFJlZmVyZW5jZUFjdGlvbihlT2JqZWN0LCByZWYpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQ29udGFpbm1lbnRSZWZlcmVuY2UoRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIHJlZikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldERlcHRoRm9yQXR0cmlidXRlKHJlZik7IGkrKykgewotCQkJRU9iamVjdCBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKChFQ2xhc3MpIHJlZi5nZXRFVHlwZSgpKTsKLQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmICghSjJFRVZlcnNpb25DaGVjay5jaGVja1JlZmVyZW5jZVZlcnNpb24ocmVmLCB2ZXJzaW9uLCBtb2R1bGVUeXBlKSkKLQkJCQljb250aW51ZTsKLQkJCXNldFJlZmVyZW5jZVZhbHVlKGVPYmplY3QsIHJlZiwgaW5zdGFuY2UpOwotCQkJaWYgKCgoSW50ZXJuYWxFT2JqZWN0KSBpbnN0YW5jZSkuZUlzUHJveHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlpZiAocmVmLmdldEVUeXBlKCkgPT0gZU9iamVjdC5lQ2xhc3MoKSkKLQkJCQllZGl0QXR0cmlidXRlcyhpbnN0YW5jZSk7Ci0JCQllbHNlCi0JCQkJZWRpdEZlYXR1cmVzKGluc3RhbmNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFJlZmVyZW5jZVZhbHVlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoIkVBbm5vdGF0aW9uIikgfHwgcmVmLmdldE5hbWUoKS5lcXVhbHMoIkVBbm5vdGF0aW9uSW1wbCIpIHx8ICFKMkVFVmVyc2lvbkNoZWNrLmNoZWNrUmVmZXJlbmNlVmVyc2lvbihyZWYsIHZlcnNpb24sIG1vZHVsZVR5cGUpKQotCQkJcmV0dXJuOwotCQlpZiAocmVmLmlzTWFueSgpKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgZU9iamVjdC5lR2V0KHJlZik7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKQotCQkJCWxpc3QuYWRkQWxsKChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCQllbHNlCi0JCQkJbGlzdC5hZGQodmFsdWUpOwotCQl9IGVsc2UgewotCQkJZU9iamVjdC5lU2V0KHJlZiwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCWlmIChlQ2xhc3NpZmllciA9PSBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzKCkpCi0JCQlyZXR1cm4gY3JlYXRlSmF2YUNsYXNzUHJveHkoZUNsYXNzaWZpZXIpOwotCQlyZXR1cm4gZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKGVDbGFzc2lmaWVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0QXR0cmlidXRlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJaWYgKGF0dC5pc0NoYW5nZWFibGUoKSAmJiBKMkVFVmVyc2lvbkNoZWNrLmNoZWNrQXR0cmlidXRlVmVyc2lvbihhdHQsIHZlcnNpb24sIG1vZHVsZVR5cGUpKSB7Ci0JCQkJT2JqZWN0IHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQllT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGF0dC5nZXRFVHlwZSgpID09IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhQ2xhc3MoKSkgewotCQkJcmV0dXJuIGNyZWF0ZUphdmFDbGFzc1Byb3h5KGF0dC5lQ2xhc3MoKSkuZ2V0Q2xhc3MoKTsKLQkJfSAKLQkJLy8gaWYgKG1vZHVsZVR5cGUgPT0gV0VCKQotCQkJcmV0dXJuIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlQXR0cmlidXRlKGF0dCwgZU9iamVjdCwgdHJ1ZSwgdmVyc2lvbiwgbW9kdWxlVHlwZSk7Ci0JCS8vcmV0dXJuIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlQXR0cmlidXRlKGF0dCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlSmF2YUNsYXNzUHJveHkoRUNsYXNzIG1ldGFDbGFzcykgewotCQlpZiAoYXZDbGFzcyA9PSBudWxsKSB7Ci0JCQlhdkNsYXNzID0gbmV3IFN0cmluZ1tdIHsgImphdmEudXRpbC5IYXNoVGFibGUiLCAiamF2YS51dGlsLkxpc3QiLCAiamF2YS5zcWwuRGF0YSIsICJqYXZhLmxhbmcuSW50ZWdlciIsICJqYXZhLmxhbmcuU3RyaW5nIiB9OwotCQl9Ci0JCVN0cmluZyBuYW1lID0gYXZDbGFzc1tjbGFzc0luZGV4XTsKLQkJY2xhc3NJbmRleCsrOwotCQlpZiAoY2xhc3NJbmRleCA9PSA1KQotCQkJY2xhc3NJbmRleCA9IDA7Ci0JCXJldHVybiBKYXZhQ2xhc3NJbXBsLmNyZWF0ZUNsYXNzUmVmKG5hbWUpOwotCX0KLQotCS8vIE9sZCBDb21wYXJlIG1ldGhvZC4uLi5ub3cgdXNpbmcgRE9NQ29tcGFyYXRvci4uLnJlbW92ZSBvbmNlIHN0YWJsZQotCXB1YmxpYyB2b2lkIGNvbXBhcmVDb250ZW50cyhTdHJpbmcgZmlsZTEsIFN0cmluZyBmaWxlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcjEgPSBudWxsOwotCSAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWludCBsaW5lbm8gPSAxOwotCQkJcmVhZGVyMSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUxKSkpOwotCQkJcmVhZGVyMiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUyKSkpOwotCQkJU3RyaW5nIGxpbmUxID0gIiIsIGxpbmUyID0gIiI7Ci0JCQl3aGlsZSAocmVhZGVyMS5yZWFkeSgpICYmIHJlYWRlcjIucmVhZHkoKSkgewotCQkJCWxpbmUxID0gcmVhZExpbmVUcmltQ29tbWVudHMocmVhZGVyMSk7IAotCQkJCWxpbmUyID0gcmVhZExpbmVUcmltQ29tbWVudHMocmVhZGVyMik7Ci0JCQkJaWYgKGxpbmUxID09IG51bGwgJiYgbGluZTIgPT0gbnVsbCAmJiBsaW5lbm8gIT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJCQkJCSAgICAKLQkJCQlpZiAoIWxpbmUxLnRyaW0oKS5lcXVhbHMobGluZTIudHJpbSgpKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJFcnJvciBhdCBsaW5lICM6ICIgKyBsaW5lbm8gKyAnXG4nICsgbGluZTEgKyAnXG4nICsgbGluZTIgKyAnXG4nOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0JCQkJCS8vYXNzZXJ0VHJ1ZShtZXNzYWdlLCBmYWxzZSk7Ci0JCQkJfQotCQkJCWxpbmVubysrOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiVGhlIGZpbGVzIGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGxpbmVzOiIgKyBsaW5lbm8gKyAnXG4nICsgbGluZTEgKyAnXG4nICsgbGluZTIgKyAnXG4nLCAoIXJlYWRlcjEucmVhZHkoKSAmJiAhcmVhZGVyMi5yZWFkeSgpKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCSAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWFzc2VydFRydWUoIklPIGZhaWxlZCIsIGZhbHNlKTsKLQkJfSBmaW5hbGx5IHsKLQkJICAgIGlmKHJlYWRlcjEgIT0gbnVsbCkKLQkJICAgICAgICByZWFkZXIxLmNsb3NlKCk7Ci0JCSAgICBpZihyZWFkZXIyICE9IG51bGwpCi0JCSAgICAgICAgcmVhZGVyMi5jbG9zZSgpOwotCQl9Ci0JfSAKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVhZExpbmVUcmltQ29tbWVudHMoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcmVhZGVyLnJlYWRMaW5lKCk7IAotICAgICAgICBpZihyZXN1bHQuaW5kZXhPZigiPCEtLSIpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaW50IGVuZENvbW1lbnRJbmR4ID0gMDsKLSAgICAgICAgICAgIHdoaWxlKHJlYWRlci5yZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYoIChlbmRDb21tZW50SW5keCA9IHJlc3VsdC5pbmRleE9mKCItLT4iKSkgPj0gMCkgCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKFN0cmluZyBmaWxlMSwgU3RyaW5nIGZpbGUyLCBTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGluZU51bWJlclJlYWRlciByZWFkZXIxID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMSkpKTsKLQkJTGluZU51bWJlclJlYWRlciByZWFkZXIyID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMikpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShyZWFkZXIxLCByZWFkZXIyLCBpZGVudGlmaWVyKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoTGluZU51bWJlclJlYWRlciByZWFkZXIxLCBMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcjIsIFN0cmluZyBpZGVudGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQl3aGlsZSAocmVhZGVyMS5yZWFkeSgpIHx8IHJlYWRlcjIucmVhZHkoKSkgewotCQkJU3RyaW5nIGxpbmUxID0gIiIsIGxpbmUyID0gIiI7Ci0JCQl3aGlsZSAocmVhZGVyMS5yZWFkeSgpICYmIGxpbmUxLmVxdWFscygiIikpIHsKLQkJCQlsaW5lMSA9IHJlYWRlcjEucmVhZExpbmUoKS50cmltKCk7Ci0JCQl9Ci0JCQl3aGlsZSAocmVhZGVyMi5yZWFkeSgpICYmIGxpbmUyLmVxdWFscygiIikpIHsKLQkJCQlsaW5lMiA9IHJlYWRlcjIucmVhZExpbmUoKS50cmltKCk7Ci0JCQl9Ci0JCQlpZiAoIWlzRXF1aXZhbGVudExpbmVzKGxpbmUxLCBsaW5lMikpIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlidWZmLmFwcGVuZCgiRGlmZmVyZW5jZSBmb3VuZCBpbiB0ZXN0ICIpOwotCi0JCQkJYnVmZi5hcHBlbmQoaWRlbnRpZmllcik7Ci0JCQkJYnVmZi5hcHBlbmQoIlxuU291cmNlIGxpbmUgIzogIik7Ci0JCQkJYnVmZi5hcHBlbmQocmVhZGVyMS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCWJ1ZmYuYXBwZW5kKCdcbicpOwotCQkJCWJ1ZmYuYXBwZW5kKGxpbmUxKTsKLQkJCQlidWZmLmFwcGVuZCgiXG5EZXN0aW5hdGlvbiBsaW5lICM6ICIpOwotCQkJCWJ1ZmYuYXBwZW5kKHJlYWRlcjIuZ2V0TGluZU51bWJlcigpKTsKLQkJCQlidWZmLmFwcGVuZCgnXG4nKTsKLQkJCQlidWZmLmFwcGVuZChsaW5lMik7Ci0JCQkJYXNzZXJ0VHJ1ZShidWZmLnRvU3RyaW5nKCksIGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gbGluZUVxdWFscyhTdHJpbmcgbGluZTEsIFN0cmluZyBsaW5lMikgewotCQlyZXR1cm4gbGluZTEuZXF1YWxzKGxpbmUyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnRMaW5lcyhTdHJpbmcgbGluZTEsIFN0cmluZyBsaW5lMikgewotCQlpZiAobGluZUVxdWFscyhsaW5lMSwgbGluZTIpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChlcXVhbFRhZ3MobGluZTEsIGxpbmUyKSkKLQkJCXJldHVybiB0cnVlOwotCQlTdHJpbmcgZXF1aXYgPSAoU3RyaW5nKSBnZXRFcXVpdmFsZW50TGluZXMoKS5nZXQobGluZTEpOwotCQlyZXR1cm4gZXF1aXYgIT0gbnVsbCAmJiBlcXVpdi5lcXVhbHMobGluZTIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbFRhZ3MoU3RyaW5nIGxpbmUxLCBTdHJpbmcgbGluZTIpewotCQkvL2RhdGEgY2hlY2ssIHRoZXJlIHNob3VsZCBiZSBubyBkYXRhIGZvciB0aGlzIHRlc3QgdG8gcmV0dXJuIHRydWUKLQkJaW50IHNob3J0RW5kSW5kZXgxID0gbGluZTEuaW5kZXhPZigiLz4iKTsKLQkJaW50IHNob3J0RW5kSW5kZXgyID0gbGluZTIuaW5kZXhPZigiLz4iKTsKLQkJaWYgKHNob3J0RW5kSW5kZXgxID09IC0xICYmIHNob3J0RW5kSW5kZXgyID09IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlIGlmIChzaG9ydEVuZEluZGV4MSAhPSAtMSl7Ci0JCQlTdHJpbmcgdGFnTmFtZTEgPSBsaW5lMS5zdWJzdHJpbmcoMSxzaG9ydEVuZEluZGV4MSk7Ci0JCQlTdHJpbmcgdGFnTmFtZTIgPSBleHRyYWN0VGFnTmFtZShsaW5lMik7Ci0JCQlpZiAoY2hlY2tOb0RhdGEobGluZTIpICYmIHRhZ05hbWUxLmVxdWFscyh0YWdOYW1lMikpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHNob3J0RW5kSW5kZXgyICE9IC0xKXsKLQkJCVN0cmluZyB0YWdOYW1lMSA9IGV4dHJhY3RUYWdOYW1lKGxpbmUxKTsgCi0JCQlTdHJpbmcgdGFnTmFtZTIgPSBsaW5lMi5zdWJzdHJpbmcoMSxzaG9ydEVuZEluZGV4Mik7Ci0JCQlpZiAoY2hlY2tOb0RhdGEobGluZTEpICYmIHRhZ05hbWUxLmVxdWFscyh0YWdOYW1lMikpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGxpbmUyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGV4dHJhY3RUYWdOYW1lKFN0cmluZyBsaW5lKSB7Ci0JCWludCBlbmRPcGVuVGFnID0gbGluZS5pbmRleE9mKCI+Iik7Ci0JCXJldHVybiBsaW5lLnN1YnN0cmluZygxLGVuZE9wZW5UYWcpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaW5lMgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tOb0RhdGEoU3RyaW5nIGxpbmUpIHsKLQkJaW50IGVuZE9wZW5UYWcgPSBsaW5lLmluZGV4T2YoIj4iKTsKLQkJaW50IHN0YXJ0RW5kVGFnID0gbGluZS5sYXN0SW5kZXhPZigiPCIpOwotCQlpZiAoZW5kT3BlblRhZyA9PSBsaW5lLmxlbmd0aCgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGVuZE9wZW5UYWcrMSA9PSBzdGFydEVuZFRhZykKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRFcXVpdmFsZW50TGluZXMoKSB7Ci0JCWlmIChlcXVpdmFsZW50TGluZXMgPT0gbnVsbCkKLQkJCWVxdWl2YWxlbnRMaW5lcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBlcXVpdmFsZW50TGluZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXF1aXZhbGVudExpbmVzKE1hcCBlcXVpdmFsZW50TGluZXMpIHsKLQkJdGhpcy5lcXVpdmFsZW50TGluZXMgPSBlcXVpdmFsZW50TGluZXM7Ci0JfQotCS8qCi0JCXB1YmxpYyB2b2lkIGNvbXBhcmVDb250ZW50cyhTdHJpbmcgZmlsZTEsIFN0cmluZyBmaWxlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlJbnB1dFN0cmVhbSBpczEsIGlzMjsKLQkJCWlzMSA9IGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMSk7Ci0JCQlpczIgPSBnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTIpOwotCQkJSW5wdXRTb3VyY2UgaW5wdXQxID0gbmV3IElucHV0U291cmNlKGlzMSk7Ci0JCQlJbnB1dFNvdXJjZSBpbnB1dDIgPSBuZXcgSW5wdXRTb3VyY2UoaXMyKTsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHJlc3VsdHM7Ci0JCQkJaWYoaWdub3JlQXR0ID09IG51bGwpCi0JCQkJCXJlc3VsdHMgPSBEb21Db21wYXJpdG9yLmNvbXBhcmVEb21zKGlucHV0MSwgaW5wdXQyKTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdHMgPSBEb21Db21wYXJpdG9yLmNvbXBhcmVEb21zKGlucHV0MSwgaW5wdXQyLCBpZ25vcmVBdHQpOwotCQkJCWlmIChyZXN1bHRzICE9IG51bGwpIHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiVW5lcXVhbCBkb21zIGNvbXBhcmVkIGFzIGVxdWFsICIgKyBmaWxlMSArICIgIiArIGZpbGUyICsgIkRldGFpbHM6ICIgKyByZXN1bHRzLCBmYWxzZSk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpczEuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlBc3NlcnQuZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCWlzMi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUFzc2VydC5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRGaWxlSW5wdXRTdHJlYW0oU3RyaW5nIHBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0JCWlmIChsb2FkZXIgPT0gbnVsbCkgewotCQkJaW4gPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lKTsKLQkJfSBlbHNlIHsKLQkJCWluID0gbG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUpOwotCQl9Ci0JCWFzc2VydFRydWUoIlVuYWJsZSB0byBmaW5kIHJlc291cmNlOiAiICsgZmlsZU5hbWUsIGluICE9IG51bGwpOwotCQlyZXR1cm4gaW47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhbERlcHRoKGludCBkZXB0aCkgewotCQlHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QuZ2VuRGVwdGggPSBkZXB0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVUeXBlKGludCB0eXBlKSB7Ci0JCW1vZHVsZVR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oaW50IHZlcnNpb24pIHsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlcHRoRm9yQXR0cmlidXRlKEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmIChyZWYuaXNNYW55KCkpCi0JCQlyZXR1cm4gZ2VuRGVwdGg7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0U2hhcmVkT2JqZWN0QnlUeXBlKEVPYmplY3Qgb3duZXIsIEVSZWZlcmVuY2UgcmVmKSB7Ci0JCXNoYXJlZFZhbHVlID0gVGVzdFV0aWxpdGllcy5nZXRPYmplY3RCeVR5cGUob3duZXIuZVJlc291cmNlKCksIHJlZi5nZXRFVHlwZSgpLCByZWYuaXNNYW55KCkpOwotCQlyZXR1cm4gc2hhcmVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJZ25vcmVBdHQoSGFzaFNldCBzZXQpIHsKLQkJaWdub3JlQXR0ID0gc2V0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC8iOwotCQkJRmlsZSBkZWwgPSBuZXcgRmlsZShvdXQpOwotCQkJZGVsZXRlRGlyZWN0b3J5KGRlbCk7Ci0JCQlkZWwuZGVsZXRlKCk7Ci0JCQlvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICIuLi90ZXN0RGF0YS90ZXN0T3V0cHV0LyI7Ci0JCQlkZWwgPSBuZXcgRmlsZShvdXQpOwotCQkJZGVsZXRlRGlyZWN0b3J5KGRlbCk7Ci0JCQlkZWwuZGVsZXRlKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KQotCSAgIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJaWYgKGRpcmVjdG9yeS5leGlzdHMoKSl7Ci0JCSAgIEZpbGVbXSBkZWxGaWxlcyA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkKLQkJICAgZm9yKGludCBpPTA7IGk8ZGVsRmlsZXMubGVuZ3RoOyArK2kpCi0JCSAgIHsKLQkJICAgICAgaWYoZGVsRmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkKLQkJICAgICAgICAgZGVsZXRlRGlyZWN0b3J5KGRlbEZpbGVzW2ldKTsKLQkJICAgICAgZGVsRmlsZXNbaV0uZGVsZXRlKCk7Ci0JCSAgIH0gIAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy9UT0RPOiBSZW1vdmUgdGhpcyBsaW5lIGFmdGVyIHdzIHhzZCdzIGFyZSByZXN0b3JlZC4KLQkJUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0dlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwNTk0Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0dlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FQXR0cmlidXRlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuSjJFRVZlcnNpb25DaGVjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuVGVzdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNBdXRoVHlwZUJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCBleHRlbmRzIEdlbmVyYWxFTUZUZXN0IHsKLSAgICAvL2lubmVyIGNsYXNzIHRvIGhhbmRsZSBkZWZmZXJlZCBzaGFyZWQgcmVmZXJlbmNlcwotICAgIHByb3RlY3RlZCBjbGFzcyBEZWZlcnJlZFNoYXJlZFJlZmVyZW5jZUFjdGlvbiB7Ci0gICAgICAgIEVPYmplY3Qgb3duZXI7Ci0gICAgICAgIEVSZWZlcmVuY2UgcmVmOwotCi0gICAgICAgIHB1YmxpYyBEZWZlcnJlZFNoYXJlZFJlZmVyZW5jZUFjdGlvbihFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOwotICAgICAgICAgICAgdGhpcy5yZWYgPSByZWY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0U2hhcmVkT2JqZWN0QnlUeXBlKG93bmVyLCByZWYpOwotICAgICAgICAgICAgc2V0UmVmZXJlbmNlVmFsdWUob3duZXIsIHJlZiwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hcCBlcXVpdmFsZW50TGluZXM7Ci0gICAgcHVibGljIExpc3QgZGVmZXJlZFJlZmVyZW5jZXM7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2VuRGVwdGggPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHNoYXJlZFZhbHVlOwotICAgIHB1YmxpYyBzdGF0aWMgSGFzaFNldCBpZ25vcmVBdHQ7Ci0KLSAgICBwdWJsaWMgaW50IHZlcnNpb247Ci0gICAgcHVibGljIGludCBtb2R1bGVUeXBlOwotICAgIC8vc3RhdGljIHZlcnNpb25zCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzIgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8zID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfNCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl81XzAgPSAzOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQTElDQVRJT04gPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUF9DTElFTlQgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RPUiA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUpCID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUIgPSA0OwotCi0gICAgcHVibGljIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdChTdHJpbmcgbmFtZSwgUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAJc3VwZXIobmFtZSwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVSb290KEVPYmplY3QgZU9iamVjdCkgewotICAgICAgICBwb3B1bGF0ZUZlYXR1cmVzKGVPYmplY3QpOwotICAgICAgICBpZiAoZGVmZXJlZFJlZmVyZW5jZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZlcmVkUmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICgoRGVmZXJyZWRTaGFyZWRSZWZlcmVuY2VBY3Rpb24pIGRlZmVyZWRSZWZlcmVuY2VzLmdldChpKSkucGVyZm9ybUFjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVGZWF0dXJlcyhFT2JqZWN0IGVPYmplY3QpIHsKLSAgICAgICAgaWYgKGVPYmplY3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwb3B1bGF0ZUF0dHJpYnV0ZXMoZU9iamVjdCk7Ci0gICAgICAgICAgICBwb3B1bGF0ZVJlZmVyZW5jZXMoZU9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVJlZmVyZW5jZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0gICAgICAgIExpc3QgcmVmZXJlbmNlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChpKTsKLSAgICAgICAgICAgIGlmICghcmVmLmlzTWFueSgpICYmIGVPYmplY3QuZUdldChyZWYpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0JCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW4gJiYgKHJlZi5lcXVhbHMoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpKSB8fCByZWYuZXF1YWxzKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1JlbW90ZUludGVyZmFjZSgpKSB8fCByZWYuZXF1YWxzKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSW50ZXJmYWNlKCkpIHx8IHJlZi5lcXVhbHMoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCkpIHx8IHJlZi5lcXVhbHMoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fU2VjdXJpdHlSb2xlUmVmcygpKSkpCi0JCQkJY29udGludWU7Ci0gICAgICAgICAgICBpZiAocmVmLmlzQ29udGFpbm1lbnQoKSkKLSAgICAgICAgICAgICAgICBwb3B1bGF0ZUNvbnRhaW5tZW50UmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoZU9iamVjdCwgcmVmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgaWYgKHJlZi5nZXRFVHlwZSgpID09IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhQ2xhc3MoKSkKLSAgICAgICAgICAgIHNldFJlZmVyZW5jZVZhbHVlKGVPYmplY3QsIHJlZiwgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVKYXZhQ2xhc3NQcm94eShyZWYsZU9iamVjdCkpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIEVQYWNrYWdlIHBrZyA9IHJlZi5nZXRFVHlwZSgpLmdldEVQYWNrYWdlKCk7Ci0gICAgICAgICAgICAvL2lmIChwa2cgPT0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpIHx8IHBrZyA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSkgewotICAgICAgICAgICAgICAgIGlmIChlT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIkVBbm5vdGF0aW9uIikgfHwgZU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJFQW5ub3RhdGlvbkltcGwiKSB8fCAhSjJFRVZlcnNpb25DaGVjay5jaGVja1JlZmVyZW5jZVZlcnNpb24ocmVmLCB2ZXJzaW9uLCBtb2R1bGVUeXBlKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGlmIChkZWZlcmVkUmVmZXJlbmNlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkZWZlcmVkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBkZWZlcmVkUmVmZXJlbmNlcy5hZGQobmV3IERlZmVycmVkU2hhcmVkUmVmZXJlbmNlQWN0aW9uKGVPYmplY3QsIHJlZikpOwotICAgICAgICAgICAgLy99Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUNvbnRhaW5tZW50UmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXREZXB0aEZvckF0dHJpYnV0ZShyZWYpOyBpKyspIHsKLSAgICAgICAgICAgIEVPYmplY3QgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZShyZWYsZU9iamVjdCk7Ci0gICAgICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpZiAoIUoyRUVWZXJzaW9uQ2hlY2suY2hlY2tSZWZlcmVuY2VWZXJzaW9uKHJlZiwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBzZXRSZWZlcmVuY2VWYWx1ZShlT2JqZWN0LCByZWYsIGluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmICgoKEludGVybmFsRU9iamVjdCkgaW5zdGFuY2UpLmVJc1Byb3h5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKHJlZi5nZXRFVHlwZSgpID09IGVPYmplY3QuZUNsYXNzKCkpCi0gICAgICAgICAgICAgICAgcG9wdWxhdGVBdHRyaWJ1dGVzKGluc3RhbmNlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwb3B1bGF0ZUZlYXR1cmVzKGluc3RhbmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFJlZmVyZW5jZVZhbHVlKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIHJlZiwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygiRUFubm90YXRpb24iKSB8fCByZWYuZ2V0TmFtZSgpLmVxdWFscygiRUFubm90YXRpb25JbXBsIikgfHwgIUoyRUVWZXJzaW9uQ2hlY2suY2hlY2tSZWZlcmVuY2VWZXJzaW9uKHJlZiwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChyZWYuaXNNYW55KCkpIHsKLSAgICAgICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBlT2JqZWN0LmVHZXQocmVmKTsKLSAgICAgICAgICAgIGlmIChsaXN0IGluc3RhbmNlb2YgQmFzaWNGZWF0dXJlTWFwKSB7Ci0gICAgICAgICAgICAJQmFzaWNGZWF0dXJlTWFwIGFNYXAgPSAoQmFzaWNGZWF0dXJlTWFwKWxpc3Q7Ci0gICAgICAgICAgICAJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotICAgICAgICAgICAgCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDb2xsZWN0aW9uKXZhbHVlKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJYU1hcC5hZGQoRmVhdHVyZU1hcFV0aWwuY3JlYXRlRW50cnkocmVmLCBvYmopKTsKLQkJCQkJfQotICAgICAgICAgICAgCX0gZWxzZSBhTWFwLmFkZChGZWF0dXJlTWFwVXRpbC5jcmVhdGVFbnRyeShyZWYsIHZhbHVlKSk7Ci0gICAgICAgICAgICAJCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikKLSAgICAgICAgICAgIAlsaXN0LmFkZEFsbCgoQ29sbGVjdGlvbikgdmFsdWUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxpc3QuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVPYmplY3QuZVNldChyZWYsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVSZWZlcmVuY2UgcmVmLCBFT2JqZWN0IGVPYmplY3QpIHsKLSAgICAgICAgaWYgKHJlZi5nZXRFVHlwZSgpID09IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhQ2xhc3MoKSkKLSAgICAgICAgICAgIHJldHVybiBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUphdmFDbGFzc1Byb3h5KHJlZiwgZU9iamVjdCk7Ci0gICAgICAgIHJldHVybiByZWYuZ2V0RVR5cGUoKS5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKS5jcmVhdGUoKEVDbGFzcylyZWYuZ2V0RVR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVBdHRyaWJ1dGVzKEVPYmplY3QgZU9iamVjdCkgewotICAgIAlpZiAoZU9iamVjdC5lQ2xhc3MoKSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRRTmFtZSgpKSB7Ci0gICAgCQlwb3B1bGF0ZUF0dHJpYnV0ZXNRTmFtZShlT2JqZWN0KTsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgICAgICBMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgRUF0dHJpYnV0ZSBhdHQgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIEVKQkxvY2FsUmVmICYmIChhdHQuZXF1YWxzKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYlJlZl9Ib21lKCkpIHx8IGF0dC5lcXVhbHMoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX1JlbW90ZSgpKSkpCi0gICAgICAgICAgICAJY29udGludWU7Ci0gICAgICAgICAgICBFQXR0cmlidXRlRGVzY3JpcHRvciBkZXNjID0gbmV3IEVBdHRyaWJ1dGVEZXNjcmlwdG9yKGF0dCxlT2JqZWN0LmVDbGFzcygpKTsKLSAgICAgICAgICAgIGlmIChkZXNjLmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJncm91cCIpKSBjb250aW51ZTsKLSAgICAgICAgICAgIHByaW1Qb3B1bGF0ZUF0dHJidXRlKGVPYmplY3QsIGF0dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUG9wdWxhdGVBdHRyYnV0ZShFT2JqZWN0IGVPYmplY3QsIEVBdHRyaWJ1dGUgYXR0KSB7Ci0gICAgICAgICAgICBpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpICYmIEoyRUVWZXJzaW9uQ2hlY2suY2hlY2tBdHRyaWJ1dGVWZXJzaW9uKGF0dCwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCA7IGogPCBnZXREZXB0aEZvckF0dHJpYnV0ZShhdHQpO2orKyl7Ci0JICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JICAgICAgICAgICAgICAgIHNldFJlZmVyZW5jZVZhbHVlKGVPYmplY3QsYXR0LHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAKLQotICAgIC8qKgotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVBdHRyaWJ1dGVzUU5hbWUoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCVN0cmluZyBwcmVmaXggPSAoU3RyaW5nKWNyZWF0ZUF0dHJpYnV0ZVZhbHVlKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFFOYW1lX0ludGVybmFsUHJlZml4T3JOc1VSSSgpLCBlT2JqZWN0KTsKLQkJU3RyaW5nIGxvY2FsUGFydCA9IChTdHJpbmcpY3JlYXRlQXR0cmlidXRlVmFsdWUoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UU5hbWVfTG9jYWxQYXJ0KCksIGVPYmplY3QpOwotCQkoKFFOYW1lKWVPYmplY3QpLnNldFZhbHVlcyhwcmVmaXgsICJodHRwOi8vd3d3LmlibS5jb20iLCBsb2NhbFBhcnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQXR0cmlidXRlVmFsdWUoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3QgZU9iamVjdCkgewotICAgICAgICBpZiAoYXR0LmdldEVUeXBlKCkgPT0gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFDbGFzcygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVKYXZhQ2xhc3NQcm94eShhdHQsZU9iamVjdCkuZ2V0Q2xhc3MoKTsKLSAgICAgICAgfSBlbHNlIGlmIChhdHQgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfQXV0aCgpKQotCQkJcmV0dXJuIGNyZWF0ZVJlc0F1dGgoYXR0LCBlT2JqZWN0KTsKLQkJZWxzZSBpZiAoYXR0ID09IEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfVHlwZSgpKQotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRUeXBlKGF0dCwgZU9iamVjdCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBwcmltQ3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLSAgICAgICAgLy9yZXR1cm4gRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVBdHRyaWJ1dGUoYXR0KTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIE9iamVjdCBwcmltQ3JlYXRlQXR0cmlidXRlVmFsdWUoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVBdHRyaWJ1dGUoYXR0LCBlT2JqZWN0LCB0cnVlLCB2ZXJzaW9uLCBtb2R1bGVUeXBlKTsKLSAgICB9Ci0KLSAgICAvLyBPbGQgQ29tcGFyZSBtZXRob2QuLi4ubm93IHVzaW5nIERPTUNvbXBhcmF0b3IuLi5yZW1vdmUgb25jZSBzdGFibGUKLSAgICBwdWJsaWMgdm9pZCBjb21wYXJlQ29udGVudHMoU3RyaW5nIGZpbGUxLCBTdHJpbmcgZmlsZTIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGxpbmVubyA9IDE7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIxID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTEpKSk7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTIpKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTEgPSAiIiwgbGluZTIgPSAiIjsKLSAgICAgICAgICAgIHdoaWxlIChyZWFkZXIxLnJlYWR5KCkgJiYgcmVhZGVyMi5yZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgbGluZTEgPSByZWFkZXIxLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSByZWFkZXIyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUxID09IG51bGwgJiYgbGluZTIgPT0gbnVsbCAmJiBsaW5lbm8gIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGlmICghbGluZTEuZXF1YWxzKGxpbmUyKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJFcnJvciBhdCBsaW5lICM6ICIgKyBsaW5lbm8gKyAnXG4nICsgbGluZTEgKyAnXG4nICsgbGluZTIgKyAnXG4nOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGFkZGVkIHRvIGVzY2FwZSBjb21wYXJlIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lbm8rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBmaWxlcyBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBsaW5lczoiICsgbGluZW5vICsgJ1xuJyArIGxpbmUxICsgJ1xuJyArIGxpbmUyICsgJ1xuJywgKCFyZWFkZXIxLnJlYWR5KCkgJiYgIXJlYWRlcjIucmVhZHkoKSkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSU8gZmFpbGVkIiwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoU3RyaW5nIGZpbGUxLCBTdHJpbmcgZmlsZTIsIFN0cmluZyBpZGVudGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcjEgPSBuZXcgTGluZU51bWJlclJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUxKSkpOwotICAgICAgICBMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcjIgPSBuZXcgTGluZU51bWJlclJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUyKSkpOwotICAgICAgICBjb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKHJlYWRlcjEsIHJlYWRlcjIsIGlkZW50aWZpZXIpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcjEsIExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyMiwgU3RyaW5nIGlkZW50aWZpZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChyZWFkZXIxLnJlYWR5KCkgfHwgcmVhZGVyMi5yZWFkeSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTEgPSAiIiwgbGluZTIgPSAiIjsKLSAgICAgICAgICAgIHdoaWxlIChyZWFkZXIxLnJlYWR5KCkgJiYgbGluZTEgIT0gbnVsbCAmJiBsaW5lMS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgbGluZTEgPSByZWFkZXIxLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUxICE9IG51bGwpCi0gICAgICAgICAgICAgICAgCWxpbmUxID0gbGluZTEudHJpbSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKHJlYWRlcjIucmVhZHkoKSAmJiBsaW5lMiAhPSBudWxsICYmIGxpbmUyLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICBsaW5lMiA9IHJlYWRlcjIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZTIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAJbGluZTIgPSBsaW5lMi50cmltKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGluZTEgIT0gbnVsbCAmJiBsaW5lMiAhPSBudWxsICYmICFpc0VxdWl2YWxlbnRMaW5lcyhsaW5lMSwgbGluZTIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAiKTsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgiXG5Tb3VyY2UgbGluZSAjOiAiKTsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChyZWFkZXIxLmdldExpbmVOdW1iZXIoKSk7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQobGluZTEpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCJcbkRlc3RpbmF0aW9uIGxpbmUgIzogIik7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQocmVhZGVyMi5nZXRMaW5lTnVtYmVyKCkpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKGxpbmUyKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYnVmZi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKGJ1ZmYpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLQkJCWFzc2VydFRydWUoIkVycm9ycyBGb3VuZCwgQ2hlY2sgQ29uc29sZS4iLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbGluZUVxdWFscyhTdHJpbmcgbGluZTEsIFN0cmluZyBsaW5lMikgewotICAgICAgICByZXR1cm4gbGluZTEgIT0gbnVsbCAmJiBsaW5lMS5lcXVhbHMobGluZTIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudExpbmVzKFN0cmluZyBsaW5lMSwgU3RyaW5nIGxpbmUyKSB7Ci0gICAgICAgIGlmIChsaW5lRXF1YWxzKGxpbmUxLCBsaW5lMikpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBTdHJpbmcgZXF1aXYgPSAoU3RyaW5nKSBnZXRFcXVpdmFsZW50TGluZXMoKS5nZXQobGluZTEpOwotICAgICAgICBpZiAoZXF1aXYgPT0gbnVsbCl7Ci0gICAgICAgIAllcXVpdiA9IChTdHJpbmcpZ2V0RXF1aXZhbGVudExpbmVzKCkuZ2V0KGxpbmUyKTsKLSAgICAgICAgCWlmIChlcXVpdiAhPSBudWxsKQotICAgICAgICAJCXJldHVybiBlcXVpdi5lcXVhbHMobGluZTEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcXVpdiAhPSBudWxsICYmIGVxdWl2LmVxdWFscyhsaW5lMik7Ci0gICAgfQotICAgIHB1YmxpYyBNYXAgZ2V0RXF1aXZhbGVudExpbmVzKCkgewotICAgICAgICBpZiAoZXF1aXZhbGVudExpbmVzID09IG51bGwpCi0gICAgICAgICAgICBlcXVpdmFsZW50TGluZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICByZXR1cm4gZXF1aXZhbGVudExpbmVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVxdWl2YWxlbnRMaW5lcyhNYXAgZXF1aXZhbGVudExpbmVzKSB7Ci0gICAgICAgIHRoaXMuZXF1aXZhbGVudExpbmVzID0gZXF1aXZhbGVudExpbmVzOwotICAgIH0KLSAgICAvKgotICAgIAlwdWJsaWMgdm9pZCBjb21wYXJlQ29udGVudHMoU3RyaW5nIGZpbGUxLCBTdHJpbmcgZmlsZTIpIHRocm93cyBFeGNlcHRpb24gewotICAgIAkJSW5wdXRTdHJlYW0gaXMxLCBpczI7Ci0gICAgCQlpczEgPSBnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTEpOwotICAgIAkJaXMyID0gZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUyKTsKLSAgICAJCUlucHV0U291cmNlIGlucHV0MSA9IG5ldyBJbnB1dFNvdXJjZShpczEpOwotICAgIAkJSW5wdXRTb3VyY2UgaW5wdXQyID0gbmV3IElucHV0U291cmNlKGlzMik7Ci0gICAgCQl0cnkgewotICAgIAkJCVN0cmluZyByZXN1bHRzOwotICAgIAkJCWlmKGlnbm9yZUF0dCA9PSBudWxsKQotICAgIAkJCQlyZXN1bHRzID0gRG9tQ29tcGFyaXRvci5jb21wYXJlRG9tcyhpbnB1dDEsIGlucHV0Mik7Ci0gICAgCQkJZWxzZQotICAgIAkJCQlyZXN1bHRzID0gRG9tQ29tcGFyaXRvci5jb21wYXJlRG9tcyhpbnB1dDEsIGlucHV0MiwgaWdub3JlQXR0KTsKLSAgICAJCQlpZiAocmVzdWx0cyAhPSBudWxsKSB7Ci0gICAgCQkJCWFzc2VydFRydWUoIlVuZXF1YWwgZG9tcyBjb21wYXJlZCBhcyBlcXVhbCAiICsgZmlsZTEgKyAiICIgKyBmaWxlMiArICJEZXRhaWxzOiAiICsgcmVzdWx0cywgZmFsc2UpOwotICAgIAkJCX0KLSAgICAJCX0gZmluYWxseSB7Ci0gICAgCQkJdHJ5IHsKLSAgICAJCQkJaXMxLmNsb3NlKCk7Ci0gICAgCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAJCQkJQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgIAkJCX0KLSAgICAJCQl0cnkgewotICAgIAkJCQlpczIuY2xvc2UoKTsKLSAgICAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgIAkJCQlBc3NlcnQuZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0gICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0RmlsZUlucHV0U3RyZWFtKFN0cmluZyBwYXRoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGluID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbiA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gZmluZCByZXNvdXJjZTogIiArIGZpbGVOYW1lLCBpbiAhPSBudWxsKTsKLSAgICAgICAgcmV0dXJuIGluOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYWxEZXB0aChpbnQgZGVwdGgpIHsKLSAgICAgICAgR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0LmdlbkRlcHRoID0gZGVwdGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TW9kdWxlVHlwZShpbnQgdHlwZSkgewotICAgICAgICBtb2R1bGVUeXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGludCB2ZXJzaW9uKSB7Ci0gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXREZXB0aEZvckF0dHJpYnV0ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotICAgICAgICBpZiAoZmVhdHVyZS5pc01hbnkoKSkKLSAgICAgICAgICAgIHJldHVybiBnZW5EZXB0aDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRTaGFyZWRPYmplY3RCeVR5cGUoRU9iamVjdCBvd25lciwgRVJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgc2hhcmVkVmFsdWUgPSBUZXN0VXRpbGl0aWVzLmdldE9iamVjdEJ5VHlwZShvd25lci5lUmVzb3VyY2UoKSwgcmVmLmdldEVUeXBlKCksIHJlZi5pc01hbnkoKSk7Ci0gICAgICAgIHJldHVybiBzaGFyZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElnbm9yZUF0dChIYXNoU2V0IHNldCkgewotICAgICAgICBpZ25vcmVBdHQgPSBzZXQ7Ci0gICAgfQotICAgIAotCQotCQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlUmVzQXV0aChFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCU9iamVjdCBhdXRoID0gbnVsbDsKLQkJZG8gewotCQkJYXV0aCA9IHByaW1DcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQl9IHdoaWxlICghaXNWYWxpZEF1dGgoKFJlc0F1dGhUeXBlQmFzZSlhdXRoKSk7Ci0JCXJldHVybiBhdXRoOwotCX0KLQkKLQkvKioKLQkgKiBXZWIgd2lsbCBuZWVkIHRvIG92ZXJyaWRlICBmb3IgSjJFRSAxLjIvMS8zCi0JICogQHBhcmFtIGF1dGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEF1dGgoUmVzQXV0aFR5cGVCYXNlIGF1dGgpIHsKLQkJcmV0dXJuIGF1dGggPT0gUmVzQXV0aFR5cGVCYXNlLkFQUExJQ0FUSU9OX0xJVEVSQUwgfHwgYXV0aCA9PSBSZXNBdXRoVHlwZUJhc2UuQ09OVEFJTkVSX0xJVEVSQUw7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlTWV0aG9kRWxlbWVudFR5cGUoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3QgZU9iamVjdCkgewotCQlPYmplY3QgdHlwZSA9IG51bGw7Ci0JCWRvIHsKLQkJCXR5cGUgPSBwcmltQ3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJfSB3aGlsZSAoIWlzVmFsaWRNZXRob2RFbGVtZW50VHlwZSgoTWV0aG9kRWxlbWVudEtpbmQpdHlwZSkpOwotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBXZWIgd2lsbCBuZWVkIHRvIG92ZXJyaWRlICBmb3IgSjJFRSAxLjIvMS8zCi0JICogQHBhcmFtIGF1dGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZE1ldGhvZEVsZW1lbnRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kIHR5cGUpIHsKLQkJaWYgICh2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiB2ZXJzaW9uICE9IFZFUlNJT05fMV80ICYmIHR5cGUgIT0gTWV0aG9kRWxlbWVudEtpbmQuU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC8iOwotCQkJRmlsZSBkZWwgPSBuZXcgRmlsZShvdXQpOwotCQkJZGVsZXRlRGlyZWN0b3J5KGRlbCk7Ci0JCQlkZWwuZGVsZXRlKCk7Ci0JCQlvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICIuLi90ZXN0RGF0YS90ZXN0T3V0cHV0LyI7Ci0JCQlkZWwgPSBuZXcgRmlsZShvdXQpOwotCQkJZGVsZXRlRGlyZWN0b3J5KGRlbCk7Ci0JCQlkZWwuZGVsZXRlKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KQotCSAgIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJaWYgKGRpcmVjdG9yeS5leGlzdHMoKSl7Ci0JCSAgIEZpbGVbXSBkZWxGaWxlcyA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkKLQkJICAgZm9yKGludCBpPTA7IGk8ZGVsRmlsZXMubGVuZ3RoOyArK2kpCi0JCSAgIHsKLQkJICAgICAgaWYoZGVsRmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkKLQkJICAgICAgICAgZGVsZXRlRGlyZWN0b3J5KGRlbEZpbGVzW2ldKTsKLQkJICAgICAgZGVsRmlsZXNbaV0uZGVsZXRlKCk7Ci0JCSAgIH0gIAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0dlbmVyYWxFTUZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0dlbmVyYWxFTUZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDk5NzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9HZW5lcmFsRU1GVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQmFzZVRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgaXRld2sKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmFsRU1GVGVzdCBleHRlbmRzIEJhc2VUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBSZW5kZXJlckZhY3RvcnkgdGVzdGluZ0ZhY3Rvcnk7Ci0JcHJpdmF0ZSBSZW5kZXJlckZhY3RvcnkgZGVmYXVsdEZhY3Rvcnk7Ci0JCi0JcHVibGljIEdlbmVyYWxFTUZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQkKLQkJZGVmYXVsdEZhY3RvcnkgPSBSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpOwotCQl0ZXN0aW5nRmFjdG9yeSA9IFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBHZW5lcmFsRU1GVGVzdChTdHJpbmcgbmFtZSwgUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCQotCQlkZWZhdWx0RmFjdG9yeSA9IFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCk7Ci0JCXRlc3RpbmdGYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9zZXQgdGhlIGRlZmF1bHQgZmFjdG9yeSB0byB0aGUgZmFjdG9yeSBuZWVkZWQgZm9yIHRoaXMgdGVzdCBydW4KLQkJUmVuZGVyZXJGYWN0b3J5LnNldERlZmF1bHRSZW5kZXJlckZhY3RvcnkodGVzdGluZ0ZhY3RvcnkpOwotCQkKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9zZXQgdGhlIGRlZmF1bHQgZmFjdG9yeSBiYWNrIHRvIHRoZSBvcmdpbmFsIGRlZmF1bHQKLQkJUmVuZGVyZXJGYWN0b3J5LnNldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoZGVmYXVsdEZhY3RvcnkpOwotCQkKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgfQotCi0JcHJvdGVjdGVkIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLSAgICB9Ci0KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0JcHJvdGVjdGVkIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJBcHBGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0gICAgCi0JcHJvdGVjdGVkIEhhc2hTZXQgaWdub3JhYmxlQXR0cmlidXRlcygpewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoImlkIik7Ci0JCXJldHVybiBzZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SYXJFTUZFZGl0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SYXJFTUZFZGl0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjQ0NjNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmFyRU1GRWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBSYXJFTUZFZGl0VGVzdCBleHRlbmRzIEdlbmVyYWxFTUZFZGl0aW5nVGVzdCB7Ci0gICAgUkFSRmlsZSByYXJGaWxlOwotCi0gICAgcHVibGljIFJhckVNRkVkaXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUmFyRU1GRWRpdFRlc3QoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgCXN1cGVyKG5hbWUsIGZhY3RvcnkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuUmFyRU1GRWRpdFRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZShSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFJhckVNRkVkaXRUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFJhckVNRkVkaXRUZXN0KCJ0ZXN0UkFSRWRpdCIsZmFjdG9yeSkpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJBUkVkaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0UmFyKCk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFNwZWNWZXJzaW9uKCkpOwotCi0JCUNvbm5lY3RvclJlc291cmNlIEREID0gKENvbm5lY3RvclJlc291cmNlKSByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0gICAgICAgCXNldE1vZHVsZVR5cGUoQ09OTkVDVE9SKTsgICAgICAgCi0gICAgICAgIGVkaXRSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0gICAgICAgIFN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBvdXQgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9FTUZNb2RlbENyZWF0aW9uVGVzdHMvRWRpdFJhckVBUiI7Ci0gICAgICAgIHJhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgcmFyRmlsZS5jbG9zZSgpOwotCi0gICAgICAgIC8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0gICAgICAgIAotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiRU1GVGVzdHMvcmEueG1sIjsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyBvdXQgKyAiL2Zvb1JBUi9NRVRBLUlORi9yYS54bWwiOwotICAgICAgICAvL2NvbXBhcmVDb250ZW50cyhjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2V0UmFyKCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJsb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL2Zvb1JBUi8iOwotICAgICAgICByYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuUkFSRmlsZShpbik7Ci0gICAgICAgIGFzc2VydFRydWUocmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmFyRU1GVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SYXJFTUZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OTRmZGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SYXJFTUZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBSYXJFTUZUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0IHsKLQlFQVJGaWxlIGVhckZpbGU7Ci0JcHJvdGVjdGVkIFJBUkZpbGUgcmFyRmlsZTsKLQotCXB1YmxpYyBSYXJFTUZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLSAgICBwdWJsaWMgUmFyRU1GVGVzdChTdHJpbmcgbmFtZSwgUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAJc3VwZXIobmFtZSwgZmFjdG9yeSk7Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlJhckVNRlRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLQkJVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZShSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFJhckVNRlRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgUmFyRU1GVGVzdCgidGVzdFJBUlBvcHVsYXRpb24iLGZhY3RvcnkpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgUmFyRU1GVGVzdCgidGVzdDE0UkFSUG9wdWxhdGlvbiIsZmFjdG9yeSkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJBUlBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlUkFSKCk7Ci0KLQkJQ29ubmVjdG9yUmVzb3VyY2UgREQgPSAoQ29ubmVjdG9yUmVzb3VyY2UpIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlzZXRNb2R1bGVUeXBlKENPTk5FQ1RPUik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1Rlc3RSYXJFQVIiOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVhckZpbGUuY2xvc2UoKTsKLQotCQkvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotCQlTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0JCVN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0Tm9JRC9yYS54bWwiOwotCQlTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RSYXJFQVIvZm9vUkFSL01FVEEtSU5GL3JhLnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdDE0UkFSUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVSQVIoKTsKLQotCQlDb25uZWN0b3JSZXNvdXJjZSBERCA9IChDb25uZWN0b3JSZXNvdXJjZSkgcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXNldE1vZHVsZVR5cGUoQ09OTkVDVE9SKTsKLQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0KLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvVGVzdDE0UmFyRUFSIjsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQkJZ2V0UmFyKCk7Ci0JCWFzc2VydFRydWUoIjEuNSIuZXF1YWxzKHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRTcGVjVmVyc2lvbigpKSk7Ci0JCW91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvVGVzdDE0UmFyRUFSMiI7Ci0JCXJhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJcmFyRmlsZS5jbG9zZSgpOwotCi0JCS8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0JCVN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLQkJU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdDE0UmFyRUFSMi9NRVRBLUlORi9yYS54bWwiOwotCQlTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3QxNFJhckVBUi9mb29SQVIvTUVUQS1JTkYvcmEueG1sIjsKLQkJc2V0SWdub3JlQXR0KGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSk7Ci0JCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkksIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGdldFJhcigpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9UZXN0MTRSYXJFQVIvZm9vUkFSIjsKLQkJcmFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlblJBUkZpbGUoaW4pOwotCQlhc3NlcnRUcnVlKHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVSQVIoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJcmFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlUkFSRmlsZUluaXRpYWxpemVkKCJmb29SQVIiKTsKLQkJcmFyRmlsZSA9IChSQVJGaWxlKSBlYXJGaWxlLmFkZENvcHkocmFyRmlsZSk7Ci0JCXJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5zZXREaXNwbGF5TmFtZSgiZm9vUkFSIik7Ci0JCWFzc2VydFRydWUocmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUVBUigpIHsKLQkJU3RyaW5nIGVhck5hbWUgPSAiVGVzdC5lYXIiOwotCQllYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoZWFyTmFtZSk7Ci0JCWFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjY3JlYXRlQXR0cmlidXRlVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCS8vVE9ETzogZGVsZXRlIHRoaXMgYWZ0ZXIgdGhlIG1vZGVsIGlzIGZpeGVkCi0JCWlmIChhdHQgPT0gSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpKQotCQkJcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKLQkJZWxzZSBpZiAoYXR0ID09IEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKSkKLQkJCXJldHVybiAiamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbCI7Ci0JCWVsc2UgaWYgKGF0dCA9PSBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfU3BlY1ZlcnNpb24oKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV8zKQotCQkJcmV0dXJuICIxLjAiOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1Jlc29sdmVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SZXNvbHZlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdiMDU5ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1Jlc29sdmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5TWV0aG9kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIFJlc29sdmVyVGVzdCBleHRlbmRzIEdlbmVyYWxFTUZFZGl0aW5nVGVzdCB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBfTUVUQV9JTkZfRUpCX0pBUl9YTUwgPSAiL01FVEEtSU5GL2VqYi1qYXIueG1sIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgRWpiUGFja2FnZSBFSkJfUEtHID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLSAgICBFQVJGaWxlIGVhckZpbGU7Ci0KLSAgICBFSkJKYXJGaWxlIGVqYkZpbGU7Ci0KLSAgICBFT2JqZWN0IG1lc0JlYW4sIGVudGl0eUJlYW47Ci0KLSAgICBTZWN1cml0eUlkZW50aXR5IHNlY0lEOwotCi0gICAgUm9sZVNvdXJjZSByb2xlU291cmNlOwotCi0gICAgaW50IE5VTV9CRUFOUyA9IDEwOwotCi0gICAgZmluYWwgaW50IE5VTV9SRUxBVElPTl9ST0xFUyA9IDI7Ci0KLSAgICBpbnQgY3JlYXRlZEJlYW5zID0gMDsKLQotICAgIGludCBjcmVhdGVkU2VjUm9sZXMgPSAwOwotCi0gICAgcHJvdGVjdGVkIGludCBjcmVhdGVkU2VjdXJpdHlJZGVudGl0aWVzID0gMDsKLQotICAgIGJvb2xlYW4gbXBGbGFnID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgUmVzb2x2ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUmVzb2x2ZXJUZXN0KFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgIAlzdXBlcihuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5tYWluKG5ldyBTdHJpbmdbXSB7IFJlc29sdmVyVGVzdC5jbGFzcy5nZXROYW1lKCl9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoUmVzb2x2ZXJUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVyVGVzdCgidGVzdFJlc29sdmVyIixmYWN0b3J5KSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVyVGVzdCgidGVzdFJlc29sdmVyTm9TY2hlbWFMb2NhdGlvbiIsZmFjdG9yeSkpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3Rlc3REYXRhL3NsIjsKLSAgICAgICAgZ2V0RUpCKGluKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIjIuMSIsIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRWZXJzaW9uKCkpOwotICAgICAgICBFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgIHNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotICAgICAgICBzZXRNb2R1bGVUeXBlKEVKQik7Ci0KLSAgICAgICAgU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3Rlc3REYXRhL3Rlc3RPdXRwdXQvc2wiOwotICAgICAgICBlamJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVqYkZpbGUuY2xvc2UoKTsKLQotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBpbiArIF9NRVRBX0lORl9FSkJfSkFSX1hNTDsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBvdXQgKyBfTUVUQV9JTkZfRUpCX0pBUl9YTUw7Ci0gICAgICAgIGNvbXBhcmVDb250ZW50cyhjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVyTm9TY2hlbWFMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGJvb2xlYW4gdmFsaWRhdGluZyA9IFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkuaXNWYWxpZGF0aW5nKCk7Ci0gICAgICAgIHRyeSB7IAotICAgICAgICAgICAgUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvbm8tc2wiOwotICAgICAgICAgICAgZ2V0RUpCKGluKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIyLjEiLCBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgIEVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgICAgIHNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotICAgICAgICAgICAgc2V0TW9kdWxlVHlwZShFSkIpOwotCi0gICAgICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvdGVzdE91dHB1dC9uby1zbCI7Ci0gICAgICAgICAgICBlamJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgICAgICBlamJGaWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGluICsgX01FVEFfSU5GX0VKQl9KQVJfWE1MOwotICAgICAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBvdXQgKyBfTUVUQV9JTkZfRUpCX0pBUl9YTUw7Ci0gICAgICAgICAgICBjb21wYXJlQ29udGVudHMoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkkpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICByZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldEVKQihTdHJpbmcgaW4pIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgZWpiRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVKQkphckZpbGUoaW4pOwotICAgICAgICBhc3NlcnRUcnVlKGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIkVudGVycHJpc2VCZWFuIikpIHsKLSAgICAgICAgICAgIGNyZWF0ZWRCZWFucysrOwotICAgICAgICAgICAgc3dpdGNoIChjcmVhdGVkQmVhbnMpIHsKLSAgICAgICAgICAgIGNhc2UgKDMpOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5SW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgY2FzZSAoNyk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VCZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgY2FzZSAoNCk6Ci0gICAgICAgICAgICBjYXNlICg4KToKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU2Vzc2lvbkJlYW5JbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVFbnRpdHlCZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIlNlY3VyaXR5SWRlbnRpdHkiKSkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVTZWN1cml0eUlkZW50aXRpeUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgZWxzZSBpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiUm9sZVNvdXJjZSIpKQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJvbGVTb3VyY2VJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgIGVsc2UgaWYgKGVDbGFzc2lmaWVyID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUF0dHJpYnV0ZSgpKSByZXR1cm4gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVTZWN1cml0eUlkZW50aXRpeUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotICAgICAgICAvKiBBbHRlcm5hdGUgdHlwZXMgKi8KLSAgICAgICAgY3JlYXRlZFNlY1JvbGVzKys7Ci0gICAgICAgIGlmICgoY3JlYXRlZFNlY1JvbGVzICYgMSkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVSb2xlU291cmNlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVSb2xlU291cmNlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZU1lc3NhZ2VCZWFuSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVNZXNzYWdlRHJpdmVuKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVNlc3Npb25CZWFuSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUVudGl0eUJlYW5JbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUVudGl0eSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5SW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3QuR2VuZXJhbEVNRlRlc3QjZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoRVJlZmVyZW5jZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERlcHRoRm9yQXR0cmlidXRlKEVSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygiZW50ZXJwcmlzZUJlYW5zIikpCi0gICAgICAgICAgICByZXR1cm4gTlVNX0JFQU5TOwotICAgICAgICBlbHNlIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygiZW50aXR5QmVhbnMiKSkKLSAgICAgICAgICAgIHJldHVybiBOVU1fQkVBTlM7Ci0gICAgICAgIGVsc2UgaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJyZWxhdGlvbnNoaXBSb2xlcyIpKSByZXR1cm4gTlVNX1JFTEFUSU9OX1JPTEVTOwotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGVwdGhGb3JBdHRyaWJ1dGUocmVmKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVGZWF0dXJlcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUZlYXR1cmVzKEVPYmplY3QgZU9iamVjdCkgewotICAgICAgICBpZiAoZU9iamVjdC5lQ2xhc3MoKSA9PSBFSkJfUEtHLmdldENNUEF0dHJpYnV0ZSgpKSB7Ci0gICAgICAgICAgICAoKENNUEF0dHJpYnV0ZSkgZU9iamVjdCkuc2V0TmFtZSgoU3RyaW5nKSBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSwgZU9iamVjdCkpOwotICAgICAgICAgICAgKChDTVBBdHRyaWJ1dGUpIGVPYmplY3QpLnNldEVUeXBlKChFQ2xhc3NpZmllcikgY3JlYXRlSmF2YUNsYXNzUHJveHkobnVsbCkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN1cGVyLmVkaXRGZWF0dXJlcyhlT2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVBdHRyaWJ1dGVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXR0cmlidXRlcyhFT2JqZWN0IGVPYmplY3QpIHsKLSAgICAgICAgaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBRdWVyeU1ldGhvZEltcGwpIHsKLSAgICAgICAgICAgIExpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIEVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJwYXJtcyIpICYmIHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKSBlT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb25JbXBsKSB7Ci0gICAgICAgICAgICBMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0LmdldE5hbWUoKS5lcXVhbHMoInVuY2hlY2tlZCIpICYmIG1wRmxhZykgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotICAgICAgICAgICAgICAgIGlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpIGVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1wRmxhZyA9ICFtcEZsYWc7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgc3VwZXIuZWRpdEF0dHJpYnV0ZXMoZU9iamVjdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIHJlZikgewotICAgICAgICBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb25JbXBsICYmIHJlZi5nZXROYW1lKCkuZXF1YWxzKCJyb2xlcyIpKSB7Ci0gICAgICAgICAgICBtcEZsYWcgPSAhbXBGbGFnOwotICAgICAgICAgICAgLy9pZiBtZXRob2QgcGVybWlzc2lvbiB1bmNoZWNrZWQgaWdub3JlIHJvbGVzCi0gICAgICAgICAgICBpZiAoIW1wRmxhZykgeyByZXR1cm47IH0KLSAgICAgICAgfQotICAgICAgICBzdXBlci5wb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShlT2JqZWN0LCByZWYpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBlYXJGaWxlID0gbnVsbDsKLSAgICAgICAgZWpiRmlsZSA9IG51bGw7Ci0gICAgICAgIG1lc0JlYW4gPSBudWxsOwotICAgICAgICBlbnRpdHlCZWFuID0gbnVsbDsKLSAgICAgICAgc2VjSUQgPSBudWxsOwotICAgICAgICByb2xlU291cmNlID0gbnVsbDsKLQotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2FyRU1GRWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2FyRU1GRWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyYzkzNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1dhckVNRkVkaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHBSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIFdhckVNRkVkaXRUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRkVkaXRpbmdUZXN0IHsKLQlwcm90ZWN0ZWQgRUFSRmlsZSBlYXJGaWxlOwkKLQlwcm90ZWN0ZWQgV0FSRmlsZSB3YXJGaWxlOwotCXByb3RlY3RlZCBpbnQgY3JlYXRlZFdlYlR5cGVzID0gMDsKLQlwcm90ZWN0ZWQgaW50IGNyZWF0ZWRFcnJvclBhZ2VzID0gMDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbUZsYWcgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBXYXJFTUZFZGl0VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFdhckVNRkVkaXRUZXN0KFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgIAlzdXBlcihuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuV2FyRU1GVGVzdCIsICItbm9sb2FkaW5nIiB9OwotICAgICAgICBUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZShSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFdhckVNRkVkaXRUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFdhckVNRkVkaXRUZXN0KCJ0ZXN0V0FSRWRpdCIsZmFjdG9yeSkpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdBUkVkaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0V0FSQ2xpZW50KCk7Ci0KLSAgICAgICAgV2ViQXBwUmVzb3VyY2UgREQgPSAoV2ViQXBwUmVzb3VyY2UpIHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShXRUIpOyAKLSAgICAgICAgZWRpdFJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotICAgICAgICBTdHJpbmcgb3V0ID0gY3VyRGlyICsgInRlc3RPdXRwdXQvRU1GTW9kZWxDcmVhdGlvblRlc3RzL0VkaXRXYXJFQVIiOwotICAgICAgICB3YXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIHdhckZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgIAotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiRU1GVGVzdHMvd2ViLnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgb3V0ICsgIi9mb29XQVIvV0VCLUlORi93ZWIueG1sIjsKLSAgICAgICAgLy9jb21wYXJlQ29udGVudHMoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldFdBUkNsaWVudCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi8iOwotICAgICAgICB3YXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuV0FSRmlsZShpbik7Ci0gICAgICAgIGFzc2VydFRydWUod2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQotCQlpZiAoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJUeXBlKCkuZXF1YWxzKGVDbGFzc2lmaWVyKSkKLQkJCXJldHVybiBjcmVhdGVXZWJUeXBlKCk7Ci0JCWVsc2UgaWYgKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXJyb3JQYWdlKCkuZXF1YWxzKGVDbGFzc2lmaWVyKSkKLQkJCXJldHVybiBjcmVhdGVFcnJvclBhZ2UoKTsKLQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCX0KLQkvKiBUaGUgd2ViIHR5cGUgaXMgYWJzdHJhY3QuICBBbHRlcm5hdGUgYmV0d2VlbiBzZXJ2bGV0LWNsYXNzCi0JICogYW5kIGpzcC1maWxlCi0JICovCi0JcHVibGljIFdlYlR5cGUgY3JlYXRlV2ViVHlwZSgpIHsKLQkJY3JlYXRlZFdlYlR5cGVzKys7Ci0JCWlmICgoY3JlYXRlZFdlYlR5cGVzICYgMSkgPT0gMCkKLQkJCXJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZsZXRUeXBlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUpTUFR5cGUoKTsKLQotCX0KLQkvKiBUaGUgZXJyb3IgcGFnZSBpcyBhYnN0cmFjdC4gIEFsdGVybmF0ZSBiZXR3ZWVuIGV4Y2VwdGlvbnR5cGUKLQkgKiBhbmQgZXJyb3IgY29kZQotCSAqLwotCXB1YmxpYyBFcnJvclBhZ2UgY3JlYXRlRXJyb3JQYWdlKCkgewotCQljcmVhdGVkRXJyb3JQYWdlcysrOwotCQlpZiAoKGNyZWF0ZWRFcnJvclBhZ2VzICYgMSkgPT0gMCkKLQkJCXJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVBdHRyaWJ1dGVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXR0cmlidXRlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBGaWx0ZXJNYXBwaW5nSW1wbCl7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCQlpZihhdHQuZ2V0TmFtZSgpLmVxdWFscygidXJsUGF0dGVybiIpICYmIGZtRmxhZyl7Ci0JCQkJCWNvbnRpbnVlOwkJCQkJCi0JCQkJfQkKLQkJCQkKLQkJCQlPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpCi0JCQkJCWVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLQkJCX0gCi0JCQlmbUZsYWcgPSAhZm1GbGFnOwotCQl9Ci0JCWVsc2UgCi0JCQlzdXBlci5lZGl0QXR0cmlidXRlcyhlT2JqZWN0KTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmKGVPYmplY3QgaW5zdGFuY2VvZiBGaWx0ZXJNYXBwaW5nSW1wbCAmJiByZWYuZ2V0TmFtZSgpLmVxdWFscygic2VydmxldCIpKXsKLQkJCWZtRmxhZyA9ICFmbUZsYWc7Ci0JCQkvL2lmIG1ldGhvZCBwZXJtaXNzaW9uIHVuY2hlY2tlZCBpZ25vcmUgcm9sZXMKLQkJCWlmKCFmbUZsYWcpewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5wb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShlT2JqZWN0LCByZWYpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2FyRU1GVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9XYXJFTUZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZmRjOWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9XYXJFTUZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNBdXRoVHlwZUJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkZpbHRlck1hcHBpbmdJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgV2FyRU1GVGVzdCBleHRlbmRzIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCB7Ci0gICAgcHJvdGVjdGVkIEVBUkZpbGUgZWFyRmlsZTsKLSAgICBwcm90ZWN0ZWQgV0FSRmlsZSB3YXJGaWxlOwotICAgIHByb3RlY3RlZCBpbnQgY3JlYXRlZFdlYlR5cGVzID0gMDsKLSAgICBwcm90ZWN0ZWQgaW50IGNyZWF0ZWRFcnJvclBhZ2VzID0gMDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbUZsYWcgPSBmYWxzZTsKLQkKLSAgICBwdWJsaWMgV2FyRU1GVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFdhckVNRlRlc3QoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgCXN1cGVyKG5hbWUsIGZhY3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLm1haW4obmV3IFN0cmluZ1tdeyBXYXJFTUZUZXN0LmNsYXNzLmdldE5hbWUoKSB9KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZShSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFdhckVNRlRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgV2FyRU1GVGVzdCgidGVzdFdBUlBvcHVsYXRpb24iLGZhY3RvcnkpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgV2FyRU1GVGVzdCgidGVzdDE0V0FSUG9wdWxhdGlvbiIsZmFjdG9yeSkpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdBUlBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotICAgICAgICBjcmVhdGVFQVIoKTsKLSAgICAgICAgY3JlYXRlV0FSQ2xpZW50KCk7Ci0KLSAgICAgICAgV2ViQXBwUmVzb3VyY2UgREQgPSAoV2ViQXBwUmVzb3VyY2UpIHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlzZXRNb2R1bGVUeXBlKFdFQik7Ci0gICAgICAgIHBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdFdhckVBUiI7Ci0gICAgICAgIGVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotCi0gICAgICAgIC8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0gICAgICAgIFN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3ROb0lEL3dlYi54bWwiOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RXYXJFQVIvZm9vV0FSL1dFQi1JTkYvd2ViLnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQlzZXRFcXVpdmFsZW50TGluZXMoZ2V0RXF1aXZhbGVudExpbmVzTWFwKCkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgdGVzdDE0V0FSUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVXQVJDbGllbnQoKTsKLQotCQlXZWJBcHBSZXNvdXJjZSBERCA9IChXZWJBcHBSZXNvdXJjZSkgd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXNldE1vZHVsZVR5cGUoV0VCKTsKLQkJLy9zZXRHZW5lcmFsRGVwdGgoMik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdFdhckVBUjE0IjsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0JCQotCQlnZXRXQVJDbGllbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjQiLCB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLQkJb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RXYXJFQVIxNF8yIjsKLQkJd2FyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQl3YXJGaWxlLmNsb3NlKCk7Ci0KLQkJLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLQkJU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotCQlTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBvdXQgKyAiL1dFQi1JTkYvd2ViLnhtbCI7Ci0JCVN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdFdhckVBUjE0L2Zvb1dBUi9XRUItSU5GL3dlYi54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1hcCBnZXRFcXVpdmFsZW50TGluZXNNYXAoKSB7Ci0JCU1hcCBsaW5lcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxpbmVzLnB1dCgiPGRpc3RyaWJ1dGFibGU+PC9kaXN0cmlidXRhYmxlPiIsICI8ZGlzdHJpYnV0YWJsZS8+Iik7IAotCQlyZXR1cm4gbGluZXM7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlV0FSQ2xpZW50KCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdBUkZpbGVJbml0aWFsaXplZCgiZm9vV0FSIik7Ci0gICAgICAgIHdhckZpbGUgPSAoV0FSRmlsZSkgZWFyRmlsZS5hZGRDb3B5KHdhckZpbGUpOwotICAgICAgICB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuc2V0RGlzcGxheU5hbWUoImZvb1dBUiIpOwotICAgICAgICBhc3NlcnRUcnVlKHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVFQVIoKSB7Ci0gICAgICAgIFN0cmluZyBlYXJOYW1lID0gIlRlc3QuZWFyIjsKLSAgICAgICAgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKGVhck5hbWUpOwotICAgICAgICBhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgZ2V0V0FSQ2xpZW50KCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1Rlc3RXYXJFQVIxNC9mb29XQVIiOwotCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKG9wdGlvbnMuU0FYKTsKLQkJd2FyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbldBUkZpbGUob3B0aW9ucywgaW4pOwotCQlhc3NlcnRUcnVlKHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0KLSAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFUmVmZXJlbmNlIHJlZixFT2JqZWN0IGVPYmplY3QpIHsKLQotICAgICAgICBpZiAoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJUeXBlKCkuZXF1YWxzKHJlZi5nZXRFVHlwZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVXZWJUeXBlKCk7Ci0gICAgICAgIGVsc2UgaWYgKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXJyb3JQYWdlKCkuZXF1YWxzKHJlZi5nZXRFVHlwZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFcnJvclBhZ2UoKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UocmVmLCBlT2JqZWN0KTsKLSAgICB9Ci0gICAgLyogVGhlIHdlYiB0eXBlIGlzIGFic3RyYWN0LiAgQWx0ZXJuYXRlIGJldHdlZW4gc2VydmxldC1jbGFzcwotICAgICAqIGFuZCBqc3AtZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBXZWJUeXBlIGNyZWF0ZVdlYlR5cGUoKSB7Ci0gICAgICAgIGNyZWF0ZWRXZWJUeXBlcysrOwotICAgICAgICBpZiAoKGNyZWF0ZWRXZWJUeXBlcyAmIDEpID09IDApCi0gICAgICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0VHlwZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKU1BUeXBlKCk7Ci0KLSAgICB9Ci0gICAgLyogVGhlIGVycm9yIHBhZ2UgaXMgYWJzdHJhY3QuICBBbHRlcm5hdGUgYmV0d2VlbiBleGNlcHRpb250eXBlCi0gICAgICogYW5kIGVycm9yIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgRXJyb3JQYWdlIGNyZWF0ZUVycm9yUGFnZSgpIHsKLSAgICAgICAgY3JlYXRlZEVycm9yUGFnZXMrKzsKLSAgICAgICAgaWYgKChjcmVhdGVkRXJyb3JQYWdlcyAmIDEpID09IDApCi0gICAgICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFcnJvckNvZGVFcnJvclBhZ2UoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpOwotICAgIH0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QuR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0I3BvcHVsYXRlQXR0cmlidXRlcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUF0dHJpYnV0ZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgRmlsdGVyTWFwcGluZ0ltcGwpewotCQkJTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRUF0dHJpYnV0ZSBhdHQgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQkJaWYoYXR0LmdldE5hbWUoKS5lcXVhbHMoInVybFBhdHRlcm4iKSAmJiBmbUZsYWcpewotCQkJCQljb250aW51ZTsJCQkJCQotCQkJCX0JCi0JCQkJCi0JCQkJT2JqZWN0IHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQlpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKQotCQkJCQllT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0JCQl9IAotCQkJZm1GbGFnID0gIWZtRmxhZzsKLQkJfQotCQllbHNlIAotCQkJc3VwZXIucG9wdWxhdGVBdHRyaWJ1dGVzKGVPYmplY3QpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLQkJaWYoZU9iamVjdCBpbnN0YW5jZW9mIEZpbHRlck1hcHBpbmdJbXBsICYmIHJlZi5nZXROYW1lKCkuZXF1YWxzKCJzZXJ2bGV0IikpewotCQkJZm1GbGFnID0gIWZtRmxhZzsKLQkJCS8vaWYgbWV0aG9kIHBlcm1pc3Npb24gdW5jaGVja2VkIGlnbm9yZSByb2xlcwotCQkJaWYoIWZtRmxhZyl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLnBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRBdXRoKFJlc0F1dGhUeXBlQmFzZSBhdXRoKSB7Ci0JCWlmICh2ZXJzaW9uID09IFZFUlNJT05fMV8yKQotCQkJcmV0dXJuIGF1dGggPT0gUmVzQXV0aFR5cGVCYXNlLlNFUlZMRVRfTElURVJBTCB8fCBhdXRoID09IFJlc0F1dGhUeXBlQmFzZS5DT05UQUlORVJfTElURVJBTDsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmlzVmFsaWRBdXRoKGF1dGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9XZWJTZXJ2aWNlc0VNRlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2ViU2VydmljZXNFTUZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZTZiMTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9XZWJTZXJ2aWNlc0VNRlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyA2LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGRmaG9sdHRwCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzRU1GVGVzdCBleHRlbmRzIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCB7Ci0JcHVibGljIEVBUkZpbGUgZWFyRmlsZTsKLQlwdWJsaWMgRUpCSmFyRmlsZSBlamJGaWxlOwotCWludCBjdXJyZW50VmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCXByaXZhdGUgaW50IGNyZWF0ZWRJbnRlcmZhY2VNYXBzID0gMDsKLQotCXB1YmxpYyBXZWJTZXJ2aWNlc0VNRlRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlc0VNRlRlc3QoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgCXN1cGVyKG5hbWUsIGZhY3RvcnkpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsgImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5XZWJTZXJ2aWNlc0VNRlRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLQkJVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShXZWJTZXJ2aWNlc0VNRlRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0MTNXZWJTZXJ2aWNlc0NsaWVudFBvcHVsYXRpb24iLGZhY3RvcnkpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0MTNXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbiIsZmFjdG9yeSkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBXZWJTZXJ2aWNlc0VNRlRlc3QoInRlc3QxNFdlYlNlcnZpY2VzRERQb3B1bGF0aW9uIixmYWN0b3J5KSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFdlYlNlcnZpY2VzRU1GVGVzdCgidGVzdDUwV2ViU2VydmljZXNERFBvcHVsYXRpb24iLGZhY3RvcnkpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0SmF4UlBDTWFwUG9wdWxhdGlvbiIsZmFjdG9yeSkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QxM1dlYlNlcnZpY2VzQ2xpZW50UG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljdXJyZW50VmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVFSkIoKTsKLQkJCi0KLQkJV2ViU2VydmljZXNSZXNvdXJjZSB3ZWJzZXJERCA9IChXZWJTZXJ2aWNlc1Jlc291cmNlKWVqYkZpbGUuZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJNRVRBLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiKSk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJd2Vic2VyREQuc2V0VmVyc2lvbklEKGN1cnJlbnRWZXJzaW9uKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXBvcHVsYXRlUm9vdCh3ZWJzZXJERC5nZXRSb290T2JqZWN0KCkpOwotCQkKLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICtnZXRQcm9qZWN0TG9jYXRpb24oKTsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF4UlBDTWFwUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljdXJyZW50VmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVFSkIoKTsKLQkJU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSA9ICJNRVRBLUlORi90ZXN0bWFwLnhtbCI7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKG1hcHBpbmdGaWxlUGF0aFVSSSk7Ci0JCVJlc291cmNlU2V0IHJlc1NldCA9IGVqYkZpbGUuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSkgcmVzU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCXJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KHVyaS5sYXN0U2VnbWVudCgpLCBuZXcgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQkJcmVzU2V0ID0gZWFyRmlsZS5nZXRSZXNvdXJjZVNldCgpOwotCQlyZWdpc3RyeSA9IChKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkpIHJlc1NldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCQlyZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudCh1cmkubGFzdFNlZ21lbnQoKSwgbmV3IEpheHJwY21hcFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0KLQkJSmF4cnBjbWFwUmVzb3VyY2UgamF4cnBjbWFwUmVzID0gKEpheHJwY21hcFJlc291cmNlKSByZXNTZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJCi0JCWpheHJwY21hcFJlcy5zZXRWZXJzaW9uSUQoY3VycmVudFZlcnNpb24pOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJCi0JCUphdmFXU0RMTWFwcGluZyBtYXAgPSBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhV1NETE1hcHBpbmcoKTsKLQkJamF4cnBjbWFwUmVzLmdldENvbnRlbnRzKCkuYWRkKG1hcCk7Ci0JCXBvcHVsYXRlUm9vdChqYXhycGNtYXBSZXMuZ2V0Um9vdE9iamVjdCgpKTsKLQkJCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArZ2V0UHJvamVjdExvY2F0aW9uKCk7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QxM1dlYlNlcnZpY2VzRERQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3VycmVudFZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZUVKQigpOwotCi0JCVdzZGRSZXNvdXJjZSB3ZWJzZXJERCA9IChXc2RkUmVzb3VyY2UpZWpiRmlsZS5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIk1FVEEtSU5GL3dlYnNlcnZpY2VzLnhtbCIpKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQl3ZWJzZXJERC5zZXRWZXJzaW9uSUQoY3VycmVudFZlcnNpb24pOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJcG9wdWxhdGVSb290KHdlYnNlckRELmdldFJvb3RPYmplY3QoKSk7Ci0JCQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgK2dldFByb2plY3RMb2NhdGlvbigpOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVhckZpbGUuY2xvc2UoKTsKLQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0MTRXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWN1cnJlbnRWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVFSkIoKTsKLQotCQlXc2RkUmVzb3VyY2Ugd2Vic2VyREQgPSAoV3NkZFJlc291cmNlKWVqYkZpbGUuZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiKSk7Ci0JCXdlYnNlckRELmdldENvbnRlbnRzKCkuYWRkKFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWJTZXJ2aWNlcygpKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQl3ZWJzZXJERC5zZXRWZXJzaW9uSUQoY3VycmVudFZlcnNpb24pOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJcG9wdWxhdGVSb290KHdlYnNlckRELmdldFJvb3RPYmplY3QoKSk7Ci0JCQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgK2dldFByb2plY3RMb2NhdGlvbigpOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVhckZpbGUuY2xvc2UoKTsKLQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0NTBXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWN1cnJlbnRWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZUVKQigpOwotCi0JCVdzZGRSZXNvdXJjZSB3ZWJzZXJERCA9IChXc2RkUmVzb3VyY2UpZWpiRmlsZS5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIk1FVEEtSU5GL3dlYnNlcnZpY2VzLnhtbCIpKTsKLQkJd2Vic2VyREQuZ2V0Q29udGVudHMoKS5hZGQoV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlNlcnZpY2VzKCkpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCXdlYnNlckRELnNldFZlcnNpb25JRChjdXJyZW50VmVyc2lvbik7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl81XzApOwotCQlwb3B1bGF0ZVJvb3Qod2Vic2VyREQuZ2V0Um9vdE9iamVjdCgpKTsKLQkJCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArZ2V0UHJvamVjdExvY2F0aW9uKCk7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JfQotCQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVSZWZlcmVuY2UgcmVmLEVPYmplY3QgZU9iamVjdCkgewotCi0gICAgICAgIGlmIChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlcmZhY2VNYXBwaW5nKCkuZXF1YWxzKHJlZi5nZXRFVHlwZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlcmZhY2VNYXAoKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UocmVmLCBlT2JqZWN0KTsKLSAgICB9Ci0JCi0gICAgLyogVGhlIHdlYiB0eXBlIGlzIGFic3RyYWN0LiAgQWx0ZXJuYXRlIGJldHdlZW4gc2VydmxldC1jbGFzcwotICAgICAqIGFuZCBqc3AtZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBJbnRlcmZhY2VNYXBwaW5nIGNyZWF0ZUludGVyZmFjZU1hcCgpIHsKLSAgICAgICAgY3JlYXRlZEludGVyZmFjZU1hcHMrKzsKLSAgICAgICAgaWYgKChjcmVhdGVkSW50ZXJmYWNlTWFwcyAmIDEpID09IDApCi0gICAgICAgICAgICByZXR1cm4gSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpOwotCi0gICAgfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdExvY2F0aW9uKCkgewotCQlpZiAoY3VycmVudFZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpCi0JCQlyZXR1cm4gInRlc3RPdXRwdXQvVGVzdFdlYlNlcnZpY2VzIjsKLQkJaWYgKGN1cnJlbnRWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotCQkJcmV0dXJuICJ0ZXN0T3V0cHV0L1Rlc3RXZWJTZXJ2aWNlczE0IjsKLQkJZWxzZQotCQkJcmV0dXJuICJ0ZXN0T3V0cHV0L1Rlc3RXZWJTZXJ2aWNlczUwIjsKLQl9Ci0JcHVibGljIHZvaWQgZ2V0RUpCKCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArZ2V0UHJvamVjdExvY2F0aW9uKCkgKyIvZm9vV2ViU2VydmljZXMiOwotCQllamJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUpCSmFyRmlsZShpbik7Ci0JCWFzc2VydFRydWUoZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFSkIoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJZWpiRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKCJmb29XZWJTZXJ2aWNlcyIpOwotCQllamJGaWxlID0gKEVKQkphckZpbGUpIGVhckZpbGUuYWRkQ29weShlamJGaWxlKTsKLQkJZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLnNldERpc3BsYXlOYW1lKCJmb29XZWJTZXJ2aWNlcyIpOwotCQlhc3NlcnRUcnVlKGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0JcHVibGljIHZvaWQgY3JlYXRlRUFSKCkgewotCQlTdHJpbmcgZWFyTmFtZSA9ICJUZXN0LmVhciI7Ci0JCWVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChlYXJOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0Fic3RyYWN0QXJjaGl2ZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BYnN0cmFjdEFyY2hpdmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MWEzMTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0Fic3RyYWN0QXJjaGl2ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0gLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwMi8wNy8wMSAxOjQ4OjE4IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RBcmNoaXZlVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7Ly8kTk9OLU5MUy0xJAotLyoqCi0gKiBBYnN0cmFjdEFyY2hpdmVUZXN0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBBYnN0cmFjdEFyY2hpdmVUZXN0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgU2V0IGdldEFsbFVucmVzb2x2ZWRQcm94aWVzKEVPYmplY3Qgcm9vdCkgewotCVNldCB2aXNpdGVkID0gbmV3IEhhc2hTZXQoKTsKLQlTZXQgcHJveGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JZ2V0QWxsVW5yZXNvbHZlZFByb3hpZXMocm9vdCwgcHJveGllcywgdmlzaXRlZCwgcm9vdC5lUmVzb3VyY2UoKSk7Ci0JcmV0dXJuIHByb3hpZXM7Ci19Ci1wdWJsaWMgdm9pZCBnZXRBbGxVbnJlc29sdmVkUHJveGllcyhFT2JqZWN0IG9iamVjdCwgU2V0IHByb3hpZXMsIFNldCB2aXNpdGVkT2JqZWN0cywgUmVzb3VyY2Ugb3JpZ2luYWxSZXNvdXJjZSkgewotCi0JaWYgKHZpc2l0ZWRPYmplY3RzLmNvbnRhaW5zKG9iamVjdCkpCi0JCXJldHVybjsKLQllbHNlCi0JCXZpc2l0ZWRPYmplY3RzLmFkZChvYmplY3QpOwotCi0JaWYgKG9iamVjdC5lUmVzb3VyY2UoKSAhPSBvcmlnaW5hbFJlc291cmNlKSB7Ci0JCWlmICgoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QgKW9iamVjdCkuZUlzUHJveHkoKSkgewotCQkJcHJveGllcy5hZGQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JTGlzdCByZWZzID0gb2JqZWN0LmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JaWYgKHJlZnMgIT0gbnVsbCkgewotCQlJdGVyYXRvciBpciA9IHJlZnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlyLmhhc05leHQoKSkgewotCQkJRVJlZmVyZW5jZSByID0gKEVSZWZlcmVuY2UpIGlyLm5leHQoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IG9iamVjdC5lR2V0KHIpOwotCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChyLmlzTWFueSgpKSB7Ci0JCQkJQ29sbGVjdGlvbiBjID0gKENvbGxlY3Rpb24pIHZhbHVlOwotCQkJCUl0ZXJhdG9yIGlyMiA9IGMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXIyLmhhc05leHQoKSkgewotCQkJCQlFT2JqZWN0IHJlZk9iaiA9IChFT2JqZWN0KSBpcjIubmV4dCgpOwotCQkJCQlnZXRBbGxVbnJlc29sdmVkUHJveGllcyhyZWZPYmosIHByb3hpZXMsIHZpc2l0ZWRPYmplY3RzLCBvcmlnaW5hbFJlc291cmNlKTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlnZXRBbGxVbnJlc29sdmVkUHJveGllcygoRU9iamVjdCkgdmFsdWUsIHByb3hpZXMsIHZpc2l0ZWRPYmplY3RzLCBvcmlnaW5hbFJlc291cmNlKTsKLQkJfQotCX0KLX0KLXB1YmxpYyBzdGF0aWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotfQotcHVibGljIHZvaWQgdmVyaWZ5UHJveGllcyhFT2JqZWN0IHJvb3QpIHsKLQotCVNldCBwcm94aWVzID0gZ2V0QWxsVW5yZXNvbHZlZFByb3hpZXMocm9vdCk7Ci0JYXNzZXJ0VHJ1ZSgiU29tZSBwcm94aWVzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCIsIHByb3hpZXMuaXNFbXB0eSgpKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BbGxBcmNoaXZlVGVzdHNFY2xpcHNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQWxsQXJjaGl2ZVRlc3RzRWNsaXBzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDlmYzZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BbGxBcmNoaXZlVGVzdHNFY2xpcHNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMTgsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQWxsQXJjaGl2ZVRlc3RzRWNsaXBzZSBleHRlbmRzIEFsbEFyY2hpdmVUZXN0c0phdmEgewotCi0gICAgcHVibGljIEFsbEFyY2hpdmVUZXN0c0VjbGlwc2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0FsbEFyY2hpdmVUZXN0c0phdmEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BbGxBcmNoaXZlVGVzdHNKYXZhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNmM4ZWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0FsbEFyY2hpdmVUZXN0c0phdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0gLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgNDo0NDowNCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFsbEFyY2hpdmVUZXN0c0phdmEgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7Ly8kTk9OLU5MUy0xJAotLyoqCi0gKiBBbGxUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgQWxsQXJjaGl2ZVRlc3RzSmF2YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotLyoqCi0gKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotICovCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkFsbFRlc3RzIiwgIi1ub2xvYWRpbmcifTsKLQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3IgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0Iik7Ci0Jc3VpdGUuYWRkVGVzdChEaXNjcmltaW5hdG9yVGVzdC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KExvb3NlQXJjaGl2ZVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoSW5pdGlhbGl6YXRpb25UZXN0cy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFNpbXBsZVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoQ29weVRlc3RzLnN1aXRlKCkpOwotLy8Jc3VpdGUuYWRkVGVzdChFSkJKYXJDb252ZXJzaW9uVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChXQVJGaWxlVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChTYXZlVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChKYXZhVGVzdHMuc3VpdGUoKSk7Ci0vLwlzdWl0ZS5hZGRUZXN0KElEVGVzdHMuc3VpdGUoKSk7Ci0JLy9zdWl0ZS5hZGRUZXN0KEFsdEREVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChTZWN1cml0eVJvbGVUZXN0cy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFJhckZpbGVUZXN0cy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFJlc291cmNlVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChDbGllbnRDb250YWluZXJSZXNvdXJjZUxvYWRUZXN0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdE1vZHVsZUNsYXNzTG9hZGluZy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3RJbnZhbGlkWG1sTXVsdGlwbGljaXR5LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuc3VpdGUoKSk7Ci0JCi0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0NsaWVudENvbnRhaW5lclJlc291cmNlTG9hZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9DbGllbnRDb250YWluZXJSZXNvdXJjZUxvYWRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDgxOTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0NsaWVudENvbnRhaW5lclJlc291cmNlTG9hZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50Q29udGFpbmVyUmVzb3VyY2VMb2FkVGVzdCBleHRlbmRzIFRlc3RDYXNlewotCXB1YmxpYyBzdGF0aWMgRUFSRmlsZSBlYXJGaWxlID0gbnVsbDsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFNpbXBsZVRlc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDbGllbnRDb250YWluZXJSZXNvdXJjZUxvYWRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc2V0VXAoKTsKLQkJQXJjaGl2ZUluaXQuaW5pdCgpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENsaWVudENvbnRhaW5lclJlc291cmNlTG9hZFRlc3QuY2xhc3MpOwotCX0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotCSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuQ2xpZW50Q29udGFpbmVyUmVzb3VyY2VMb2FkVGVzdCIsICItbm9sb2FkaW5nIiB9OwotCQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENsaWVudENvbnRhaW5lckxvYWQgKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQotCQkJQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCk7Ci0JCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJtdGFwcDIuZWFyIjsKLQkJCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJtdGFwcDJGaW5pc2hlZC5lYXIiOwotCQkJZWFyRmlsZSA9IGZhY3Rvcnkub3BlbkVBUkZpbGUgKGluKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoInVyaTogIiArIGVhckZpbGUuZ2V0VVJJKCkpOwotCi0JCQlMaXN0IGFwcENsaWVudHMgPSBlYXJGaWxlLmdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZXMoKTsKLQkJCWJvb2xlYW4gZXhGb3VuZDEgPSBmYWxzZTsKLQkJCWJvb2xlYW4gZXhGb3VuZDIgPSBmYWxzZTsKLQkJCQotCQkJZm9yKGludCBpID0gMDsgaTxhcHBDbGllbnRzLnNpemUoKTsgaSsrKXsKLQkJCQlBcHBsaWNhdGlvbkNsaWVudEZpbGUgZmlsZSA9IChBcHBsaWNhdGlvbkNsaWVudEZpbGUpYXBwQ2xpZW50cy5nZXQoMCk7Ci0JCQkJUmVzb3VyY2UgcmVzOwotCi0JCQkJdHJ5ewotCQkJCQlyZXMgPSBmaWxlLmdldE1vZlJlc291cmNlKCJNRVRBLUlORi9GT09jbGllbnQtcmVzb3VyY2UueG1pIik7Ci0JCQkJfSBjYXRjaChFeGNlcHRpb24gZSl7CQotCQkJCQlleEZvdW5kMSA9IHRydWU7Ci0JCQkJCWlmKCEoZSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikpewotCQkJCQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiwgZmFsc2UpOwotCQkJCQl9CQkKLQkJCQl9Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJcmVzID0gZmlsZS5nZXRNb2ZSZXNvdXJjZSgiTUVUQS1JTkYvY2xpZW50LXJlc291cmNlLnhtaSIpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWV4Rm91bmQyID0gdHJ1ZTsKLQkJCQkJaWYoIShlIGluc3RhbmNlb2YgUmVzb3VyY2VMb2FkRXhjZXB0aW9uKSl7Ci0JCQkJCQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBSZXNvdXJjZUxvYWRFeGNlcHRpb24iLCBmYWxzZSk7Ci0JCQkJCX0JCi0JCQkJfQotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiTm8gZXhjZXB0aW9uIGxvZ2dlZCBmb3Igbm9uLWV4aXN0aW5nIGZpbGUiLCBleEZvdW5kMSk7Ci0JCQlhc3NlcnRUcnVlKCJObyBleGNlcHRpb24gbG9nZ2VkIGZvciBleGlzdGluZyIsIGV4Rm91bmQyKTsKLQotCQkJCi0JCQllYXJGaWxlLnNhdmVBcyhvdXQpOwotCQkJZWFyRmlsZS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQ29weVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQ29weVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZTYxNjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0NvcHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8xNC8wMCAxMjoxMDozNiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIENvcHlUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIENvcHlUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ29weVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQl9Ci0JcHVibGljIEVqYkZhY3RvcnkgZ2V0RUpCRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgRWpiUGFja2FnZSBnZXRFSkJQYWNrYWdlKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCXB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViRmFjdG9yeSgpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JfQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0JICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsgImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5Db3B5VGVzdHMiLCAiLW5vbG9hZGluZyIgfTsKLQkJVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENvcHlUZXN0cy5jbGFzcyk7Ci0JfQotCS8qKgotCSAqIFRlc3RzIHRoZSBhZGRDb3B5KFJlYWRPbmx5RGlyZWN0b3J5KSBhcGkgb24gYXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3B5RGlyZWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJV0FSRmlsZSBhV2FyRmlsZSA9IChXQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImV4YW1wbGUyLndhciIpOwotCi0JCVJlYWRPbmx5RGlyZWN0b3J5IHNhbXBsZURpcmVjdG9yeSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlblJlYWRPbmx5RGlyZWN0b3J5KEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIldhclRlc3RDbGFzc2VzIik7Ci0JCQotCQlpbnQgaW5pdGlhbFNpemUgPSBhV2FyRmlsZS5nZXRGaWxlcygpLnNpemUoKTsKLQotCQlhV2FyRmlsZS5hZGRDb3B5KHNhbXBsZURpcmVjdG9yeSk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhV2FyRmlsZS5nZXRGaWxlcygpLml0ZXJhdG9yKCk7Ci0JCS8vRm9yIHJ1bm5pbmcgaW5zaWRlIGVjbGlwc2UKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgdXJpID0gKChGaWxlKWl0ZXIubmV4dCgpKS5nZXRVUkkoKTsKLQkJCWlmICh1cmkuaW5kZXhPZigiQ1ZTIikgPj0gMCkgCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgZmlsZXMgIiwgYVdhckZpbGUuZ2V0RmlsZXMoKS5zaXplKCkgPT0gaW5pdGlhbFNpemUgKyA3KTsKLQkJYVdhckZpbGUuc2F2ZUFzTm9SZW9wZW4oQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9Db3B5VGVzdHMvYWRkQ29weURpci53YXIiKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3B5TW9kdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0JCUVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLQkJTGlzdCBtb2R1bGVzID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLQkJRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gbnVsbDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKSB7Ci0JCQkJZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBlYXJGaWxlLmdldEZpbGUoYU1vZHVsZS5nZXRVcmkoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlhc3NlcnRUcnVlKCJFSkJKYXJGaWxlIHNob3VsZCBub3QgYmUgbnVsbCIsIGVqYkphckZpbGUgIT0gbnVsbCk7Ci0JCWVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQlFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L0NvcHlUZXN0cy9uZXdFYXJXaXRoQ29waWVkTW9kdWxlLmVhciIpOwotCQluZXdFYXJGaWxlLmFkZENvcHkoZWpiSmFyRmlsZSk7Ci0JCUVKQkphckZpbGUgY29waWVkID0gKEVKQkphckZpbGUpIG5ld0VhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydFRydWUoY29waWVkLmlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSk7Ci0JCWFzc2VydFRydWUoY29waWVkLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgPT0gY29waWVkLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmdldCgwKSk7Ci0JCWFzc2VydFRydWUoY29waWVkLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpKTsKLQkJYXNzZXJ0VHJ1ZShlamJKYXJGaWxlLmdldEZpbGVzKCkuc2l6ZSgpID09IGNvcGllZC5nZXRGaWxlcygpLnNpemUoKSk7Ci0KLQkJbmV3RWFyRmlsZS5zYXZlTm9SZW9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHBlciBDTVZDIGRlZmVjdCByZXBvcnQgOTYxOTcKLQkgKiBDcmVhdGUgYSBuZXcgYXBwbGljYXRpb24sIG9wZW4gZWpiIGphciBmaWxlLCB1c2UgYWRkY29weSB0byBhZGQgdGhlIG1vZHVsZSwgYW5kIHNhdmUKLQkgKiB1c2luZyBvcmlnaW5hbCBlYXIsIGdldCB0aGUgZWpiIGphciwgYW5kIG1vZGlmeSBiaW5kaW5ncwotCSAqIHNhdmUgYWdhaW4KLQkgKiBSZXN1bHQ6ICBiaW5kaW5ncyBub3QgdXBkYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3B5TW9kdWxlRmlsZXNUb0VBUigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdXJpID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9Db3B5VGVzdHMvdGVzdEFkZENvcHlNb2R1bGVGaWxlc1RvRUFSLmVhciI7Ci0JCS8vQ3JlYXRlIGEgbmV3IGVhciBmaWxlLCBhZGQgYSBzdGFuZGFsb25lIGVqYiBqYXIgZmlsZSBhbmQgc3RhbmRhbG9uZSB3YXIgZmlsZSwgYW5kIHNhdmUKLQkJRUFSRmlsZSBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQodXJpKTsKLQkJZWFyRmlsZS5zZXRKMkVFVmVyc2lvbihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCWVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5zZXREaXNwbGF5TmFtZSh1cmkpOwotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImJhbmtlamJzLmphciIpOwotCQllYXJGaWxlLmFkZENvcHkoZWpiSmFyRmlsZSk7Ci0JCVdBUkZpbGUgd2FyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbldBUkZpbGUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZXhhbXBsZTIud2FyIik7Ci0JCWVhckZpbGUuYWRkQ29weSh3YXJGaWxlKTsKLQkJKChXZWJNb2R1bGUpIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRGaXJzdE1vZHVsZSh3YXJGaWxlLmdldFVSSSgpKSkuc2V0Q29udGV4dFJvb3QoIi8iKTsKLQkJZWFyRmlsZS5zYXZlKCk7Ci0KLQkJZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBlYXJGaWxlLmdldEVKQkphckZpbGVzKCkuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJlamIgZGQgcmVzb3VyY2Ugbm90IHJpZ2h0IiwgZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmVSZXNvdXJjZSgpID09IGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKTsKLQotCQkKLQotCQl3YXJGaWxlID0gKFdBUkZpbGUpIGVhckZpbGUuZ2V0V0FSRmlsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIndhciBkZCByZXNvdXJjZSBub3QgcmlnaHQiLCB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZVJlc291cmNlKCkgPT0gd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpOwotCi0JCQotCQllYXJGaWxlLnNhdmVOb1Jlb3BlbigpOwotCi0JCQotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQl9Ci0JLyoqCi0JICogVGVzdHMgb3BlbmluZyBhIHN0YW5kYWxvbmUgbW9kdWxlIHdpdGggYW4gYWJzb2x1dGUgcGF0aCwgYW5kIGFkZGluZyB0aGF0IHRvIGEgbmV3IGVhciBmaWxlLCBwZXIgZGVmZWN0IHJlcG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3B5U3RhbmRhbG9uZU1vZHVsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJiYW5rZWpicy5qYXIiOwotCi0JCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGZpbGVOYW1lKTsKLQkJZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCUVBUkZpbGUgbmV3RWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvQ29weVRlc3RzL25ld0VhcldpdGhTdGFuZEFsb25lTW9kdWxlLW91dC5lYXIiKTsKLQkJbmV3RWFyRmlsZS5hZGRDb3B5KGVqYkphckZpbGUpOwotCQlFSkJKYXJGaWxlIGNvcGllZCA9IChFSkJKYXJGaWxlKSBuZXdFYXJGaWxlLmdldE1vZHVsZUZpbGVzKCkuZ2V0KDApOwotCQlhc3NlcnRUcnVlKGNvcGllZC5pc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkpOwotCQlhc3NlcnRUcnVlKGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpID09IGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5nZXQoMCkpOwotCQlhc3NlcnRUcnVlKGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSk7Ci0JCWFzc2VydFRydWUoZWpiSmFyRmlsZS5nZXRGaWxlcygpLnNpemUoKSA9PSBjb3BpZWQuZ2V0RmlsZXMoKS5zaXplKCkpOwotCi0JCW5ld0VhckZpbGUuc2F2ZU5vUmVvcGVuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbmFtZUFuZERlbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotCQlFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0JCUxpc3QgbW9kdWxlcyA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCk7Ci0JCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IG51bGw7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkgewotCQkJCWVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZWFyRmlsZS5nZXRGaWxlKGFNb2R1bGUuZ2V0VXJpKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSgiRUpCSmFyRmlsZSBzaG91bGQgbm90IGJlIG51bGwiLCBlamJKYXJGaWxlICE9IG51bGwpOwotCQllamJKYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9Db3B5VGVzdHMvbmV3RWFyV2l0aENvcGllZE1vZHVsZS5lYXIiKTsKLQkJRUpCTW9kdWxlUmVmIGFkZGVkQ29weSA9IChFSkJNb2R1bGVSZWYpIG5ld0VhckZpbGUuYWRkQ29weVJlZihlamJKYXJGaWxlKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlIGZpbGVzIHNob3VsZCBub3QgYmUgZW1wdHkiLCAhbmV3RWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSIsICFuZXdFYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZSBzaG91bGQgYmUgYWNjZXNzaWJsZSBhbmQgaGF2ZSB0aGUgc2FtZSB1cmkgYXMgZmlsZSIsIGFkZGVkQ29weS5nZXRNb2R1bGUoKS5nZXRVcmkoKS5lcXVhbHMoYWRkZWRDb3B5LmdldE1vZHVsZUZpbGUoKS5nZXRVUkkoKSkpOwotCi0JCVN0cmluZyBuZXdVUkkgPSAidGVtcC9mb29iYXIuamFyIjsKLQkJYWRkZWRDb3B5LnNldFVSSShuZXdVUkkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGUgc2hvdWxkIGJlIGFjY2Vzc2libGUgYW5kIGhhdmUgdGhlIG5ldyByZW5hbWVkIHVyaSBhcyB3ZWxsIGFzIHRoZSBmaWxlIiwgYWRkZWRDb3B5LmdldE1vZHVsZSgpLmdldFVyaSgpLmVxdWFscyhhZGRlZENvcHkuZ2V0TW9kdWxlRmlsZSgpLmdldFVSSSgpKSAmJiBhZGRlZENvcHkuZ2V0TW9kdWxlKCkuZ2V0VXJpKCkuZXF1YWxzKG5ld1VSSSkpOwotCQluZXdFYXJGaWxlLnJlbW92ZShhZGRlZENvcHkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGUgZmlsZXMgc2hvdWxkIGJlIGVtcHR5IiwgbmV3RWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZXMgc2hvdWxkIGJlIGVtcHR5IiwgbmV3RWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKS5pc0VtcHR5KCkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbmFtZUFuZERlbGV0ZVN0YW5kYWxvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgZmlsZU5hbWUgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJiYW5rZWpicy5qYXIiOwotCi0JCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGZpbGVOYW1lKTsKLQotCQlFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L0NvcHlUZXN0cy9uZXdFYXJXaXRoQ29waWVkTW9kdWxlLmVhciIpOwotCQlFSkJNb2R1bGVSZWYgYWRkZWRDb3B5ID0gKEVKQk1vZHVsZVJlZikgbmV3RWFyRmlsZS5hZGRDb3B5UmVmKGVqYkphckZpbGUpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGUgZmlsZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSIsICFuZXdFYXJGaWxlLmdldE1vZHVsZUZpbGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlcyBzaG91bGQgbm90IGJlIGVtcHR5IiwgIW5ld0VhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlIHNob3VsZCBiZSBhY2Nlc3NpYmxlIGFuZCBoYXZlIHRoZSBzYW1lIHVyaSBhcyBmaWxlIiwgYWRkZWRDb3B5LmdldE1vZHVsZSgpLmdldFVyaSgpLmVxdWFscyhhZGRlZENvcHkuZ2V0TW9kdWxlRmlsZSgpLmdldFVSSSgpKSk7Ci0KLQkJU3RyaW5nIG5ld1VSSSA9ICJ0ZW1wL2Zvb2Jhci5qYXIiOwotCQlhZGRlZENvcHkuc2V0VVJJKG5ld1VSSSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZSBzaG91bGQgYmUgYWNjZXNzaWJsZSBhbmQgaGF2ZSB0aGUgbmV3IHJlbmFtZWQgdXJpIGFzIHdlbGwgYXMgdGhlIGZpbGUiLCBhZGRlZENvcHkuZ2V0TW9kdWxlKCkuZ2V0VXJpKCkuZXF1YWxzKGFkZGVkQ29weS5nZXRNb2R1bGVGaWxlKCkuZ2V0VVJJKCkpICYmIGFkZGVkQ29weS5nZXRNb2R1bGUoKS5nZXRVcmkoKS5lcXVhbHMobmV3VVJJKSk7Ci0JCW5ld0VhckZpbGUucmVtb3ZlKGFkZGVkQ29weSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZSBmaWxlcyBzaG91bGQgYmUgZW1wdHkiLCBuZXdFYXJGaWxlLmdldE1vZHVsZUZpbGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlcyBzaG91bGQgYmUgZW1wdHkiLCBuZXdFYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpLmlzRW1wdHkoKSk7Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzOTNmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMjAsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtCi0gKiBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIERlZmVjdFZlcmlmaWNhdGlvblRlc3RzKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIERlZmVjdFZlcmlmaWNhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JICAgIC8qVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCSAgICBzdWl0ZS5hZGRUZXN0KG5ldyBEZWZlY3RWZXJpZmljYXRpb25UZXN0cygidGVzdEZpbHRlck1hcHBpbmdUcmFuc2xhdG9yIikpOwotCSAgICByZXR1cm4gc3VpdGU7Ki8KLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuY2xhc3MpOyAKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyTWFwcGluZ1RyYW5zbGF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8qCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLkRPTSk7Ci0JCWZpbmFsIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0JCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJRUFSRmlsZSBlYXJGaWxlID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUob3B0aW9ucywKLQkJCQllYXJQYXRoKTsKLQkJLy8gb3BlbiB0aGUgZWFyCi0JCVN5c3RlbS5vdXQucHJpbnRsbigib3BlbmluZyAiICsgYXJjaGl2ZSArICIgLi4uICIpOyovCi0JICAgIAotCSAgICBTdHJpbmcgYXJjaGl2ZSA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIlFJRGVmZWN0c05ldy5lYXIiOwotCSAgICBTdHJpbmcgbmFtZSA9ICJRSURlZmVjdHMud2FyIjsKLQkJICAvKgotCQkgICAqIGNyYWNrIG9wZW4gdGhlIGVhciBmaWxlIHVzaW5nIHRoZSBjb21tb24gYXJjaGl2ZToKLQkJICAgKi8KLQkJICBDb21tb25hcmNoaXZlRmFjdG9yeSBhcmNoaXZlRmFjdG9yeSA9IChDb21tb25hcmNoaXZlRmFjdG9yeSkgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQkJICBBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCSAgb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuU0FYKTsKLQkJICBvcHRpb25zLnNldFVzZUphdmFSZWZsZWN0aW9uKGZhbHNlKTsKLQkJICAvLyAgIG9wdGlvbnMuc2V0RGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMoZXh0cmFQcm9jZXNzaW5nKTsKLQkJICAJCQotCQkgIAkJRUFSRmlsZSBlYXJGaWxlID0gYXJjaGl2ZUZhY3Rvcnkub3BlbkVBUkZpbGUob3B0aW9ucywgYXJjaGl2ZSk7Ci0JCQkJV2ViTW9kdWxlUmVmIHdhckZpbGUgPSBudWxsOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IGVhckZpbGUuZ2V0TW9kdWxlUmVmcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCSAgICBNb2R1bGVSZWYgbXJlZiA9IChNb2R1bGVSZWYpIGkubmV4dCgpOwotCQkJCSAgICBpZiAobmFtZS5lcXVhbHMobXJlZi5nZXRVcmkoKSkpIHsgCi0JCQkJICAgICAgICB3YXJGaWxlID0gIChXZWJNb2R1bGVSZWYpIG1yZWY7Ci0JCQkJICAgIH0KLQkJCQl9Ci0gICAKLQkJCQlXZWJBcHAgZGQgPSAoV2ViQXBwKXdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgIAotCQkJCUVMaXN0IGZpbHRlck1hcHBpbmdzID0gZGQuZ2V0RmlsdGVyTWFwcGluZ3MoKTsKLQkJCQlhc3NlcnRUcnVlKCJUaGUgdGVzdCByZXF1aXJlcyB0d28gZmlsdGVyIG1hcHBpbmdzLiIsIGZpbHRlck1hcHBpbmdzLnNpemUoKSA9PSAyKTsgCi0JCQkJRmlsdGVyTWFwcGluZyBmaWx0ZXJNYXBwaW5nMSA9IChGaWx0ZXJNYXBwaW5nKWZpbHRlck1hcHBpbmdzLmdldCgwKTsKLQkJCQlhc3NlcnROb3ROdWxsKCJBIFVSTCBQYXR0ZXJuIHdhcyBub3QgZm91bmQgZm9yIGZpbHRlciB3aXRoIG5hbWUgIiArIGZpbHRlck1hcHBpbmcxLmdldEZpbHRlcigpLmdldE5hbWUoKSxmaWx0ZXJNYXBwaW5nMS5nZXRVcmxQYXR0ZXJuKCkpOwotCQkJCUZpbHRlck1hcHBpbmcgZmlsdGVyTWFwcGluZzIgPSAoRmlsdGVyTWFwcGluZylmaWx0ZXJNYXBwaW5ncy5nZXQoMSk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiQSBTZXJ2bGV0IG5hbWUgd2FzIG5vdCBmb3VuZCBmb3IgZmlsdGVyIHdpdGggbmFtZSAiICsgZmlsdGVyTWFwcGluZzIuZ2V0RmlsdGVyKCkuZ2V0TmFtZSgpLGZpbHRlck1hcHBpbmcyLmdldFNlcnZsZXROYW1lKCkpOwotCQkJCWFzc2VydE5vdE51bGwoIkEgU2VydmxldCB3YXMgbm90IGZvdW5kIGZvciBmaWx0ZXIgd2l0aCBuYW1lICIgKyBmaWx0ZXJNYXBwaW5nMi5nZXRGaWx0ZXIoKS5nZXROYW1lKCksZmlsdGVyTWFwcGluZzIuZ2V0U2VydmxldCgpKTsKLQkJCQkgICAgICAKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Rm9ybWVyRGVmZWN0Mjk3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuRE9NKTsKLQkJZmluYWwgU3RyaW5nIGVhclBhdGggPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQlFQVJGaWxlIGVhckZpbGUgPSBwa2cuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShvcHRpb25zLAotCQkJCWVhclBhdGgpOwotCQllYXJGaWxlLmV4dHJhY3ROb1Jlb3BlbihBcmNoaXZlLkVYUEFORF9BTEwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGb3JtZXJEZWZlY3QxNDU5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuRE9NKTsKLQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQlDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0KLQkJRUFSRmlsZSBlYXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQob3B0aW9ucywgIlRlc3QuZWFyIik7Ci0JCWVhckZpbGUuc2F2ZUFzKCJDOlxcVGVzdC5lYXIiKTsKLQl9Ci0KLQkvKgotCSAqIHB1YmxpYyB2b2lkIHRlc3RDb3JydXB0ZWRFQVIoKSB0aHJvd3MgRXhjZXB0aW9uIHsgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9Ci0JICogbmV3IEFyY2hpdmVPcHRpb25zKCk7IG9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLkRPTSk7IGZpbmFsCi0JICogU3RyaW5nIGVhclBhdGggPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJvY2NhbS5lYXIiOwotCSAqIENvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkgKiBDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JICogCi0JICogRUFSRmlsZSBlYXJGaWxlID0gZmFjdG9yeS5vcGVuRUFSRmlsZShvcHRpb25zLCBlYXJQYXRoKTsKLQkgKiAKLQkgKiBMaXN0IGZpbGVzID0gZWFyRmlsZS5nZXRGaWxlcygpOwotCSAqIAotCSAqIGZvcihpbnQgaT0wOyBpIDxmaWxlcy5zaXplKCk7IGkrKykgeyBTeXN0ZW0uZXJyLnByaW50bG4oZmlsZXMuZ2V0KGkpKTsKLQkgKiByZWFkRmlsZSggKEZpbGUpIGZpbGVzLmdldChpKSk7IGlmKGZpbGVzLmdldChpKSBpbnN0YW5jZW9mIFdBUkZpbGUpIHsKLQkgKiBXQVJGaWxlIHdhciA9IChXQVJGaWxlKSBmaWxlcy5nZXQoaSk7IExpc3Qgd2FyRmlsZXMgPSB3YXIuZ2V0RmlsZXMoKTsKLQkgKiBmb3IoaW50IGo9MDsgaiA8d2FyRmlsZXMuc2l6ZSgpOyBqKyspIHsKLQkgKiBTeXN0ZW0uZXJyLnByaW50bG4od2FyRmlsZXMuZ2V0KGopKTsgcmVhZEZpbGUoKEZpbGUpd2FyRmlsZXMuZ2V0KGopKTsgfSB9IH0KLQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUiKTsgfQotCSAqLwotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZEZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGlzID0gZmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotCQlaaXBJbnB1dFN0cmVhbSB6aXMgPSBuZXcgWmlwSW5wdXRTdHJlYW0oaXMpOwotCQl0cnkgewotCQkJd2hpbGUgKHppcy5nZXROZXh0RW50cnkoKSAhPSBudWxsKTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJaXMuY2xvc2UoKTsKLQkJCWlmICh6aXMgIT0gbnVsbCkKLQkJCQl6aXMuY2xvc2UoKTsKLQkJCWlzID0gbnVsbDsKLQkJCXppcyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2aW5nRUFSV2hpbGVEZXBsb3lpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJCW9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLlNBWCk7Ci0JCQlvcHRpb25zLnNldFVzZUphdmFSZWZsZWN0aW9uKHRydWUpOwotCQkJZmluYWwgU3RyaW5nIGVhclBhdGggPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeQotCQkJCQkrICJBdWN0aW9uQXBwLmVhciI7Ci0JCQlDb21tb25hcmNoaXZlUGFja2FnZSBwa2cgPSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQlFQVJGaWxlIGVhckZpbGUgPSBwa2cuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZSgKLQkJCQkJb3B0aW9ucywgZWFyUGF0aCk7Ci0JCQlwcmludEZpbGVzKGVhckZpbGUpOwotCQkJZWFyRmlsZS5zYXZlKCk7Ci0KLQkJCWVhckZpbGUucmVvcGVuKCk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gd2UpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZSk7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0TWVzc2FnZSgpKTsKLQkJCWlmICh3ZS5nZXRDYXVzZSgpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldENhdXNlKCkpOwotCQkJaWYgKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpKTsKLQkJCWlmICh3ZS5nZXROZXN0ZWRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRDb25jYXRlbmF0ZWRNZXNzYWdlcygpKTsKLQkJCXRocm93IHdlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0aW5nRUFSRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCQlmaW5hbCBTdHJpbmcgZWFyUGF0aCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5Ci0JCQkJKyAiSW5pdGlhbGl6ZWRFQVIuZWFyIjsKLQotCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0SXNSZWFkT25seSh0cnVlKTsKLQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuRE9NKTsKLQotCQkvLyBuZXcgZWFyIGZpbGUKLQkJRUFSRmlsZSBlYXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQob3B0aW9ucywgZWFyUGF0aCk7Ci0KLQkJQXBwbGljYXRpb24gYXBwbCA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlUU5hbWVUcmFuc2xhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlvcHRpb25zLnNldFJlbmRlcmVyVHlwZShBcmNoaXZlT3B0aW9ucy5TQVgpOyAKLQkJCWZpbmFsIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiV1NTZWN1cmVkX0luc3VyYW5jZVNlcnZpY2VzX0VKQl9XUy5lYXIiOwotCQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCQkJRUFSRmlsZSBlYXJGaWxlID0gZmFjdG9yeS5vcGVuRUFSRmlsZShvcHRpb25zLCBlYXJQYXRoKTsKLQkJCXByaW50RmlsZXMoZWFyRmlsZSk7Ci0JCQlTdHJpbmcgdG1wID0gIkM6XFx0ZW1wXFwiK1N5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJZWFyRmlsZS5leHRyYWN0VG8odG1wLCAwKTsgIAotCQkJCQotCQkJTGlzdCBlamJNb2R1bGVSZWZzID0gZWFyRmlsZS5nZXRFSkJNb2R1bGVSZWZzKCk7Ci0KLQkJCWZvcihpbnQgaT0wOyBpPGVqYk1vZHVsZVJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFSkJNb2R1bGVSZWYgZWpibW9kcmVmID0gKEVKQk1vZHVsZVJlZikgZWpiTW9kdWxlUmVmcy5nZXQoaSk7Ci0JCQkJaWYoZWpibW9kcmVmLmdldFVyaSgpLmVxdWFscygiV1NJbnNTZXNzaW9uMjBFSkIuamFyIikpIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gZWpibW9kcmVmLmdldE1vZlJlc291cmNlKCJNRVRBLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiKTsgCi0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihyZXMuZ2V0VVJJKCkpOwotCQkJCQkgCi0JCQkJfQotCQkJfQotCQkJLyoKLQkJCSAqIEFwcGxpY2F0aW9uIGFwcCA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsgTGlzdCBtb2R1bGVzID0KLQkJCSAqIGFwcC5nZXRNb2R1bGVzKCk7IGZvcihpbnQgaT0wOyBpIDxtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkgKiBTeXN0ZW0uZXJyLnByaW50bG4obW9kdWxlcy5nZXQoaSkpOyBNb2R1bGUKLQkJCSAqIG1vZD0oTW9kdWxlKW1vZHVsZXMuZ2V0KGkpOyBpZiggbW9kLmlzRWpiTW9kdWxlKCkgKSB7IEVqYk1vZHVsZQotCQkJICogZWpiTW9kdWxlID0gKEVqYk1vZHVsZSkgbW9kOyBFSkJKYXJGaWxlIGVqYkphckZpbGUgPQotCQkJICogZmFjdG9yeS5vcGVuRUpCSmFyRmlsZShvcHRpb25zLCAiV1NJbnNTZXNzaW9uMjBFSkIuamFyIik7IEVKQkphcgotCQkJICogZWpiamFyID0gZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOyB9Ci0JCQkgKiAgfQotCQkJICovCi0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gd2UpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZSk7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0TWVzc2FnZSgpKTsKLQkJCWlmKHdlLmdldENhdXNlKCkgIT0gbnVsbCkgCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldENhdXNlKCkpOwotCQkJaWYod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkpOwotCQkJaWYod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKSk7Ci0JCQl0aHJvdyB3ZTsKLQkJfSAgCi0gICAgfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZENyaW1zb25DYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlvcHRpb25zLnNldFJlbmRlcmVyVHlwZShBcmNoaXZlT3B0aW9ucy5ET00pOyAKLQkJCWZpbmFsIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkKLQkJCQkJKyAiZWpiX3NhbV9IZWxsby5lYXIiOwotCQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJRUFSRmlsZSBlYXJGaWxlID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoCi0JCQkJCW9wdGlvbnMsIGVhclBhdGgpOwotCQkJQXBwbGljYXRpb24gYXBwID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IHJlYWQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiIsIGFwcCk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlxuXG4qKioqKioqKioqKioqKioqKipQcmludGluZyBmaWxlcyBmcm9tICIgKyBhcHAuZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgcmVhZCBkaXNwbGF5IG5hbWUgZnJvbSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIiwgYXBwLmdldERpc3BsYXlOYW1lKCkpOwotCQkJcHJpbnRGaWxlcyhlYXJGaWxlKTsKLQkJCWVhckZpbGUuZXh0cmFjdFRvKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvdGVtcCIsIDApOwotCQkJZWFyRmlsZS5yZW9wZW4oKTsKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiB3ZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlKTsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRNZXNzYWdlKCkpOwotCQkJaWYgKHdlLmdldENhdXNlKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0Q2F1c2UoKSk7Ci0JCQlpZiAod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkpOwotCQkJaWYgKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCkpOwotCQkJdGhyb3cgd2U7Ci0JCX0KLQl9Ci0JCi0JLypwdWJsaWMgdm9pZCB0ZXN0UmVhZEluaXRQYXJtczEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICAgIHJlYWRJbml0UGFybXModHJ1ZSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RSZWFkSW5pdFBhcm1zMTQoKSB0aHJvd3MgRXhjZXB0aW9uewotCSAgICByZWFkSW5pdFBhcm1zKGZhbHNlKTsKLQl9CSovCi0JCi0JLypwdWJsaWMgdm9pZCByZWFkSW5pdFBhcm1zKGJvb2xlYW4gaXMxMykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7IAotCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2luZyBKMkVFICIgKyAoaXMxMz8iMS4zIiA6IjEuNCIpICk7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlvcHRpb25zLnNldFJlbmRlcmVyVHlwZShBcmNoaXZlT3B0aW9ucy5ET00pOyAKLQkJCWZpbmFsIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkKLQkJCQkJKyAoKGlzMTMpID8gImZpbHRlcjEzd2FyLmVhciIgOiAgInNlcnZsZXRfanNfZmlsdGVyLmVhciIpOwotCQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJRUFSRmlsZSBlYXJGaWxlID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoCi0JCQkJCW9wdGlvbnMsIGVhclBhdGgpOwotCQkJV0FSRmlsZSB3YXJGaWxlID0gKFdBUkZpbGUpIChpczEzID8gZWFyRmlsZS5nZXRGaWxlKCJGaWx0ZXJXYXIud2FyIikgOmVhckZpbGUuZ2V0RmlsZSgic2VydmxldF9qc19maWx0ZXJfd2ViLndhciIpKTsKLQkJCVdlYkFwcCB3ZWJhcHAgPSB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7IAotCQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHdlYiBhcHAgREQgY291bGQgbm90IGJlIGxvY2F0ZWQiLCB3ZWJhcHApOwotCQkJRUxpc3QgZmlsdGVycyA9IHdlYmFwcC5nZXRGaWx0ZXJzKCk7Ci0JCQlGaWx0ZXIgZiA9IG51bGw7Ci0JCQlFTGlzdCBwYXJtcywgcGFyYW1WYWx1ZXM7Ci0JCQlmb3IoaW50IGk9MDsgaTxmaWx0ZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkgICAgZiA9IChGaWx0ZXIpIGZpbHRlcnMuZ2V0KGkpOwotCQkJICAgIFN5c3RlbS5vdXQucHJpbnRsbihmKTsKLQkJCSAgICBFTGlzdCBwYXJtcyA9IGYuZ2V0SW5pdFBhcmFtcygpOwotCQkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgYXJlICIgKyBwYXJtcy5zaXplKCkgKyAiIEluaXRQYXJhbXMiKTsKLQkJCSAgICBmb3IoaW50IGo9MDsgajxwYXJtcy5zaXplKCk7IGorKykgewotCQkJICAgICAgICBJbml0UGFyYW0gcCA9IChJbml0UGFyYW0pIHBhcm1zLmdldChqKTsKLQkJCSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHApOwotCQkJICAgIH0KLQkJCSAgICBFTGlzdCBwYXJhbVZhbHVlcyA9IGYuZ2V0SW5pdFBhcmFtVmFsdWVzKCk7Ci0JCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSBhcmUgIiArIHBhcmFtVmFsdWVzLnNpemUoKSArICIgSW5pdFBhcmFtVmFsdWVzIik7Ci0JCQkgICAgZm9yKGludCBqPTA7IGo8cGFyYW1WYWx1ZXMuc2l6ZSgpOyBqKyspIHsKLQkJCSAgICAgICAgUGFyYW1WYWx1ZSBwID0gKFBhcmFtVmFsdWUpIHBhcmFtVmFsdWVzLmdldChqKTsKLQkJCSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHApOwotCQkJICAgIH0KLQkJCSAgICAKLQkJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlbW8gdmVyc2lvbiBjYXNlIik7Ci0JCQkgICAgCi0JCQkgICAgCi0JCQkgICAgV2ViQXBwIGNvbnRhaW5lciA9IChXZWJBcHApIGYuZUNvbnRhaW5lcigpOwotCQkJICAgIHN3aXRjaChjb250YWluZXIuZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCQkgICAgICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ6IAotCQkJICAgICAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOgotCi0JCQkJCSAgICBwYXJtcyA9IGYuZ2V0SW5pdFBhcmFtcygpOwotCQkJCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSBhcmUgIiArIHBhcm1zLnNpemUoKSArICIgSW5pdFBhcmFtcyIpOwotCQkJCQkgICAgYXNzZXJ0RXF1YWxzKCJUaGVyZSBtdXN0IGJlIDIgRmlsdGVyIEluaXQgUGFyYW1zIiwgcGFybXMuc2l6ZSgpLCAyKTsKLQkJCQkJICAgIGZvcihpbnQgaj0wOyBqPHBhcm1zLnNpemUoKTsgaisrKSB7Ci0JCQkJCSAgICAgICAgSW5pdFBhcmFtIGlwID0gKEluaXRQYXJhbSkgcGFybXMuZ2V0KGopOwotCQkJCQkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwKTsKLQkJCQkJICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcGFyYW0gbmFtZXMgbXVjaCBtYXRjaCIsICgicGFyYW0iK2orIm5hbWUiKS5lcXVhbHMoaXAuZ2V0UGFyYW1OYW1lKCkpKTsKLQkJCQkJICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcGFyYW0gdmFsdWVzIG11Y2ggbWF0Y2giLCAoInBhcmFtIitqKyJ2YWx1ZSIpLmVxdWFscyhpcC5nZXRQYXJhbVZhbHVlKCkpKTsKLQkJCQkJICAgIH0KLQkJCQkJICAgIGJyZWFrOwotCQkJICAgICAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOiBkZWZhdWx0OiB7Ci0KLQkJCQkJICAgIHBhcmFtVmFsdWVzID0gZi5nZXRJbml0UGFyYW1WYWx1ZXMoKTsKLQkJCSAgICAgICAgCWFzc2VydEVxdWFscygiVGhlcmUgbXVzdCBiZSAxIEZpbHRlciBJbml0IFBhcmFtIFZhbHVlcyIsIHBhcmFtVmFsdWVzLnNpemUoKSwgMSk7Ci0JCQkJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZXJlIGFyZSAiICsgcGFyYW1WYWx1ZXMuc2l6ZSgpICsgIiBJbml0UGFyYW1WYWx1ZXMiKTsKLQkJCQkJICAgIAotCQkJCSAgICAgICAgUGFyYW1WYWx1ZSBwdiA9IChQYXJhbVZhbHVlKSBwYXJhbVZhbHVlcy5nZXQoMCk7IAotCQkJCSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHB2KTsgCi0JCQkJICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcGFyYW0gbmFtZXMgbXVjaCBtYXRjaCIsICgiYXR0cmlidXRlIikuZXF1YWxzKHB2LmdldE5hbWUoKSkpOwotCQkJCSAgICAgICAgU3RyaW5nIGV4cGVjdGVkVmFsdWUgPSAoaSA9PSAwKSA/ICJjb20uc3VuLnRzLnRlc3RzLnNlcnZsZXQuYXBpLmphdmF4X3NlcnZsZXQuZmlsdGVyLkRvRmlsdGVyX0ZpbHRlci5TRVJWTEVUX01BUFBFRCIgOiAiY29tLnN1bi50cy50ZXN0cy5zZXJ2bGV0LmFwaS5qYXZheF9zZXJ2bGV0LmZpbHRlci5Jbml0RmlsdGVyX0ZpbHRlci5TRVJWTEVUX01BUFBFRCI7IAotCQkJCSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgcGFyYW0gdmFsdWVzIG11Y2ggbWF0Y2giLCBleHBlY3RlZFZhbHVlICwgcHYuZ2V0VmFsdWUoKSk7Ci0JCQkgICAgICAgIH0KLQkJCQkJICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJCQotCQkJICAgIAotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIHdlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UpOwotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldE1lc3NhZ2UoKSk7Ci0JCQlpZiAod2UuZ2V0Q2F1c2UoKSAhPSBudWxsKQotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRDYXVzZSgpKTsKLQkJCWlmICh3ZS5nZXROZXN0ZWRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXROZXN0ZWRFeGNlcHRpb24oKSk7Ci0JCQlpZiAod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKSk7Ci0JCQl0aHJvdyB3ZTsKLQkJfQotCX0qLwotCSAKLQkKLQlwcml2YXRlIHZvaWQgcHJpbnRGaWxlcyhDb250YWluZXIgYXIpIHsKLQkJTGlzdCBmaWxlcyA9IGFyLmdldEZpbGVzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGZpbGVzLmdldChpKSk7Ci0JCQlpZiAoZmlsZXMuZ2V0KGkpIGluc3RhbmNlb2YgQ29udGFpbmVyKSB7Ci0JCQkJQ29udGFpbmVyIHRhaW5lciA9IChDb250YWluZXIpIGZpbGVzLmdldChpKTsKLQkJCQlwcmludEZpbGVzKHRhaW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRGlzY3JpbWluYXRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9EaXNjcmltaW5hdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQ3ODZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9EaXNjcmltaW5hdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5HZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLQotCi0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxLCAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICovCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjcmltaW5hdG9yVGVzdAotICAgICAgICBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGFzc2VydEJhckZpbGUgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBEaXNjcmltaW5hdG9yVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkRpc2NyaW1pbmF0b3JUZXN0Iik7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IERpc2NyaW1pbmF0b3JUZXN0KCJ0ZXN0RGlzY3JpbWluYXRvciIpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIC8vIFRPRE8gSW1wbGVtZW50IHVuaXQgdGVzdCBmb3IgZGlzY3JpbWluYXRvciBmcmFtZXdvcmsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRCYXJGaWxlID0gdHJ1ZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvclJlZ2lzdHJ5LnJlZ2lzdG9yRGlzY3JpbWluYXRvcihuZXcgQmV2ZXJhZ2VBcmNoaXZlRGlzY3JpbWluYXRvcigpKTsKLSAgICAgICAgICAgIEFyY2hpdmUgYXJjaGl2ZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuQXJjaGl2ZSggQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArICJteS5iYXIiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBhcmNoaXZlIHdhcyBub3QgZm91bmQhIiwgYXJjaGl2ZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBhcmNoaXZlIGV4dGVuc2lvbiAoLmJhcikgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgY3VzdG9tIGV4dGVuc2lvbiEiLCBhcmNoaXZlLmlzTmVzdGVkQXJjaGl2ZSgibXkuYmFyIikpOwotCi0gICAgICAgICAgICBib29sZWFuIHR5cGVDb250cmlidXRlZFN1Y2Nlc3NmdWxseSA9IGZhbHNlOwotICAgICAgICAgICAgRUxpc3QgdHlwZXMgPSBhcmNoaXZlLmdldFR5cGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVzLmdldChpKS5lcXVhbHMoQmV2ZXJhZ2VBcmNoaXZlRGlzY3JpbWluYXRvci5CRVZFUkFHRV9BUkNISVZFX1RZUEVfS0VZKSkgewotICAgICAgICAgICAgICAgICAgICB0eXBlQ29udHJpYnV0ZWRTdWNjZXNzZnVsbHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgQkVWRVJBR0VfQVJDSElWRV9UWVBFX0tFWSB3YXMgbm90IGZvdW5kIGluIHRoZSBsaXN0IG9mIHR5cGVzIG9mIHRoZSBhcmNoaXZlISIsIHR5cGVDb250cmlidXRlZFN1Y2Nlc3NmdWxseSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBhc3NlcnRCYXJGaWxlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgQmV2ZXJhZ2VBcmNoaXZlRGlzY3JpbWluYXRvcgotICAgICAgICAgICAgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIEdlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgewotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFVkVSQUdFX0FSQ0hJVkVfVFlQRV9LRVkgPSAiY29tLmlibS5iZXZlcmFnZS5hcmNoaXZlIjsKLQotICAgICAgICAvKgotICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvciNkaXNjcmltaW5hdGUoY29tLmlibS5ldG9vbHMuajJlZS5jb21tb25hcmNoaXZlY29yZS5BcmNoaXZlKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzY3JpbWluYXRlKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoIk1FVEEtSU5GL2FkdWx0LWJldmVyYWdlLWltYmliZW1lbnQtb3B0aW9ucy54bWwiKTsKLSAgICAgICAgICAgIGlmIChhc3NlcnRCYXJGaWxlKQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgQmV2ZXJhZ2VBcmNoaXZlRGlzY3JpbWluYXRvciBkaWQgbm90IHJlY29nbmlaZSB0aGUgZmlsZSEgKEVuc3VyZSBpdCBjb250YWlucyBhIGZpbGUgbmFtZWQgTUVUQS1JTkYvYWR1bHQtYmV2ZXJhZ2UtaW1iaWJlbWVudC12ZW51ZXMueG1sKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvciNnZXRDdXN0b21GaWxlRXh0ZW5zaW9ucygpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q3VzdG9tRmlsZUV4dGVuc2lvbnMoKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyAiYmFyIn07Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIChub24tSmF2YWRvYykKLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS5jb21tb25hcmNoaXZlY29yZS5HZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yI2dldFR5cGVLZXkoKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUeXBlS2V5KCkgewotCi0gICAgICAgICAgICByZXR1cm4gQkVWRVJBR0VfQVJDSElWRV9UWVBFX0tFWTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRG9tQ29tcGFyaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0RvbUNvbXBhcml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0YzFlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRG9tQ29tcGFyaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotCi0vKioKLSAqIFRIRSBNQVNURVIgQ09QWSBvZiB0aGlzIGNsYXNzIGlzIGluIGNvbS5pYm0uZXRvb2xzLmNvbW1vbnRlc3RzCi0gKiBQbGVhc2UgdXBkYXRlIHRoZSBjb3B5IGluIGNvbW1vbnRlc3RzIGFuZCB0aGVuIGNvcHkgdGhpcyBjbGFzcyB0bwotICogd2hlcmUgeW91IG5lZWQgaXQgaWYgeW91IGFyZSBsb29raW5nIGF0IGEgZGlmZmVyZW50IGNvcHkKLSAqIAotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRG9tQ29tcGFyaXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaFNldCBhdHRyaWJ1dGVMaXN0OwotLy8gVE9ETyByZXBsYWNlIHRoaXMgd2l0aCBub24geGVyY2VzCQotLy8gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGFyZURvbXMoSW5wdXRTb3VyY2Ugc291cmNlMSwgSW5wdXRTb3VyY2Ugc291cmNlMiwgSGFzaFNldCBpZ25vcmFibGVBdHRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgIAlhdHRyaWJ1dGVMaXN0ID0gaWdub3JhYmxlQXR0czsKLS8vICAgIAlET01QYXJzZXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwotLy8gICAgCWlmIChlbnRpdHlSZXNvbHZlciA9PSBudWxsKSB7Ci0vLyAgICAgICAgIHBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihuZXcgRW50aXR5UmVzb2x2ZXIoKSB7Ci0vLwkgICAgICAgICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLS8vCSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLS8vCSAgICAgICAgICAgIH0KLS8vCQotLy8JICAgICAgICB9KTsKLS8vICAgIAl9IGVsc2UgewotLy8gICAgCQlwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIoZW50aXR5UmVzb2x2ZXIpOwotLy8gICAgCX0KLS8vICAgICAgICBwYXJzZXIucGFyc2Uoc291cmNlMSk7Ci0vLyAgICAgICAgRG9jdW1lbnQgZG9jMSA9IHBhcnNlci5nZXREb2N1bWVudCgpOwotLy8gICAgICAgIHBhcnNlci5wYXJzZShzb3VyY2UyKTsKLS8vICAgICAgICBEb2N1bWVudCBkb2MyID0gcGFyc2VyLmdldERvY3VtZW50KCk7Ci0vLyAgICAgICAgcmV0dXJuIGNvbXBhcmVOb2Rlcyhkb2MxLCBkb2MyKTsKLS8vICAgIH0KLQotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGFyZURvbXMoSW5wdXRTb3VyY2Ugc291cmNlMSwgSW5wdXRTb3VyY2Ugc291cmNlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJcmV0dXJuIGNvbXBhcmVEb21zKHNvdXJjZTEsIHNvdXJjZTIsIG51bGwpOwotLy8JfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wYXJlTm9kZXMoTm9kZSBub2RlMSwgTm9kZSBub2RlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNraW5nIEE6IiArIG5vZGUxKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tpbmcgQjoiICsgbm9kZTIpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJub2RlVHlwZT0iICsgbm9kZTEuZ2V0Tm9kZVR5cGUoKSk7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldE5vZGVOYW1lPSIgKyBub2RlMS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0Tm9kZVZhbHVlPSIgKyBub2RlMS5nZXROb2RlVmFsdWUoKSk7Ci0KLSAgICAgICAgLy9HZW5lcmljIE5vZGUgVGVzdGluZyAKLSAgICAgICAgaWYgKG5vZGUxID09IG51bGwgJiYgbm9kZTIgPT0gbnVsbCkKLSAgICAgICAgCXJldHVybiBudWxsOyAKLSAgICAgICAgZWxzZSBpZiAoKG5vZGUxICE9IG51bGwgJiYgbm9kZTIgPT0gbnVsbCkgfHwgbm9kZTEgPT0gbnVsbCAmJiBub2RlMiAhPSBudWxsKQotICAgICAgICAJcmV0dXJuIG51bGxOb2RlRW5jb3VudGVyZWQobm9kZTEsIG5vZGUyKTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZWxzZSBpZiAobm9kZTEuZ2V0Tm9kZVR5cGUoKSAhPSBub2RlMi5nZXROb2RlVHlwZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZVR5cGUoKSAiICsgbm9kZTEuZ2V0Tm9kZVR5cGUoKSArICIgIiArIG5vZGUyLmdldE5vZGVUeXBlKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIH0gZWxzZSBpZiAobm9kZTEuZ2V0Tm9kZU5hbWUoKSAhPSBub2RlMi5nZXROb2RlTmFtZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZU5hbWUoKSA8IiArIG5vZGUxLmdldE5vZGVOYW1lKCkgKyAiPiA8IiArIG5vZGUyLmdldE5vZGVOYW1lKCkgKyAiPiIsIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIH0gZWxzZSBpZiAoIShub2RlMS5nZXROb2RlVmFsdWUoKSA9PSBudWxsICYmIG5vZGUyLmdldE5vZGVWYWx1ZSgpID09IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAobm9kZTEuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiTm9kZS5nZXROb2RlVmFsdWUoKSBub2RlIEEgaXMgbnVsbCIsIG5vZGUxLCBub2RlMik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUyLmdldE5vZGVWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZVZhbHVlKCkgbm9kZSBCIGlzIG51bGwiLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbm9kZTEuZ2V0Tm9kZVZhbHVlKCkuZXF1YWxzKG5vZGUyLmdldE5vZGVWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiTm9kZS5nZXROb2RlVmFsdWUoKSA8IiArIG5vZGUxLmdldE5vZGVWYWx1ZSgpICsgIj4gPCIgKyBub2RlMi5nZXROb2RlVmFsdWUoKSArICI+Iiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChub2RlMS5oYXNBdHRyaWJ1dGVzKCkgIT0gbm9kZTIuaGFzQXR0cmlidXRlcygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuaGFzQXR0cmlidXRlcygpICIgKyBub2RlMS5oYXNBdHRyaWJ1dGVzKCkgKyAiICIgKyBub2RlMi5oYXNBdHRyaWJ1dGVzKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIH0gZWxzZSBpZiAobm9kZTEuaGFzQ2hpbGROb2RlcygpICE9IG5vZGUyLmhhc0NoaWxkTm9kZXMoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmhhc0NoaWxkTm9kZXMoKSAiICsgbm9kZTEuaGFzQ2hpbGROb2RlcygpICsgIiAiICsgbm9kZTIuaGFzQ2hpbGROb2RlcygpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9Ci0JCS8vVE9ETyBzdHJlbmd0aGVuIG5vZGUgY29tcGFyaXNvbnMgYXMgbmVjZXNzYXJ5Ci0gICAgICAgIC8vU3BlY2lhbGl6ZWQgTm9kZSBUZXN0aW5nCi0gICAgICAgIHN3aXRjaCAobm9kZTEuZ2V0Tm9kZVR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXJEYXRhIGNkYXRhMSA9IChDaGFyYWN0ZXJEYXRhKSBub2RlMTsKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXJEYXRhIGNkYXRhMiA9IChDaGFyYWN0ZXJEYXRhKSBub2RlMjsKLSAgICAgICAgICAgICAgICBpZiAoIWNkYXRhMS5nZXREYXRhKCkuZXF1YWxzKGNkYXRhMi5nZXREYXRhKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiQ2hhcmFjdGVyRGF0YS5nZXREYXRhKCkgIiArIGNkYXRhMS5nZXREYXRhKCkgKyAiICIgKyBjZGF0YTIuZ2V0RGF0YSgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICAgICAgICAgICAgQXR0ciBhdHRyMSA9IChBdHRyKSBub2RlMTsKLSAgICAgICAgICAgICAgICBBdHRyIGF0dHIyID0gKEF0dHIpIG5vZGUyOwotICAgICAgICAgICAgICAgIAlpZiAoIWF0dHIxLmdldE5hbWUoKS5lcXVhbHMoYXR0cjIuZ2V0TmFtZSgpKSkgewotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJBdHRyLmdldE5hbWUoKSAiICsgYXR0cjEuZ2V0TmFtZSgpICsgIiAiICsgYXR0cjIuZ2V0TmFtZSgpLCBub2RlMSwgbm9kZTIpOwotCSAgICAgICAgICAgICAgICB9IAotCSAgICAgICAgICAgICAgICBlbHNlIGlmKCBhdHRyaWJ1dGVMaXN0ICE9IG51bGwgJiYgIWF0dHJpYnV0ZUxpc3QuY29udGFpbnMoYXR0cjEuZ2V0TmFtZSgpKSAmJiAhYXR0cmlidXRlTGlzdC5jb250YWlucyhhdHRyMi5nZXROYW1lKCkpKSB7Ci0JCQkJCQlpZiAoIWF0dHIxLmdldFZhbHVlKCkuZXF1YWxzKGF0dHIyLmdldFZhbHVlKCkpKSB7Ci0JCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJBdHRyLmdldFZhbHVlKCkgIiArIGF0dHIxLmdldFZhbHVlKCkgKyAiICIgKyBhdHRyMi5nZXRWYWx1ZSgpLCBub2RlMSwgbm9kZTIpOwotCQkgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyMS5nZXRTcGVjaWZpZWQoKSAhPSBhdHRyMi5nZXRTcGVjaWZpZWQoKSkgewotCQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiQXR0ci5nZXRTcGVjaWZpZWQoKSAiICsgYXR0cjEuZ2V0U3BlY2lmaWVkKCkgKyAiICIgKyBhdHRyMi5nZXRTcGVjaWZpZWQoKSwgbm9kZTEsIG5vZGUyKTsKLQkJICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOgotICAgICAgICAgICAgCURvY3VtZW50IGRvYzEgPSAoRG9jdW1lbnQpbm9kZTE7Ci0JCQkJRG9jdW1lbnQgZG9jMiA9IChEb2N1bWVudClub2RlMjsKLQkJCQlTdHJpbmcgcmVzdWx0ID0gY29tcGFyZU5vZGVzKGRvYzEuZ2V0RG9jdHlwZSgpLCBkb2MyLmdldERvY3R5cGUoKSk7Ci0JCQkJaWYocmVzdWx0ICE9IG51bGwpewotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6Ci0JCQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUxID0gKERvY3VtZW50VHlwZSlub2RlMTsKLQkJCQlEb2N1bWVudFR5cGUgZG9jVHlwZTIgPSAoRG9jdW1lbnRUeXBlKW5vZGUyOwotCQkJCWlmKCFkb2NUeXBlMS5nZXRQdWJsaWNJZCgpLmVxdWFscyhkb2NUeXBlMi5nZXRQdWJsaWNJZCgpKSl7Ci0JCQkJCXJldHVybiBtaXNtYXRjaCgiRG9jdW1lbnRUeXBlLmdldFB1YmxpY0lkKCkgIitkb2NUeXBlMS5nZXRQdWJsaWNJZCgpKyAiICIrZG9jVHlwZTIuZ2V0UHVibGljSWQoKSwgbm9kZTEsIG5vZGUyKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgICAgICAgIAlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcEluc3QxID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilub2RlMTsKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcEluc3QyID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilub2RlMjsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZ0luc3RydWN0aW9uIHRvZG8iKTsKLSAgICAgICAgICAgIAlicmVhazsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFIDoKLQkJCQlEb2N1bWVudEZyYWdtZW50IGZyYWcxID0gKERvY3VtZW50RnJhZ21lbnQpbm9kZTE7Ci0JCQkJRG9jdW1lbnRGcmFnbWVudCBmcmFnMiA9IChEb2N1bWVudEZyYWdtZW50KW5vZGUyOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudEZyYWdtZW50IHRvZG8iKTsKLSAgICAgICAgICAgIAlicmVhazsKLQkJCQotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgICAgICAgIGNhc2UgTm9kZS5FTlRJVFlfTk9ERSA6Ci0JCQljYXNlIE5vZGUuTk9UQVRJT05fTk9ERSA6Ci0JCQkJYnJlYWs7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vUmVjdXJzaW9uCi0gICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzMSA9IG5vZGUxLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMyID0gbm9kZTIuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICAgIGlmIChhdHRyaWJ1dGVzMSAhPSBudWxsICYmIGF0dHJpYnV0ZXMyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzMS5nZXRMZW5ndGgoKSAhPSBhdHRyaWJ1dGVzMi5nZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiZ2V0QXR0cmlidXRlcygpLmdldExlbmd0aCgpICIgKyBhdHRyaWJ1dGVzMS5nZXRMZW5ndGgoKSArICIgIiArIGF0dHJpYnV0ZXMyLmdldExlbmd0aCgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzMS5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQXR0ciBhdHRyMSA9IChBdHRyKSBhdHRyaWJ1dGVzMS5pdGVtKGkpOwotCQkJCUF0dHIgYXR0cjIgPSAoQXR0cikgYXR0cmlidXRlczIuaXRlbShpKTsKLQkJCQlpZighYXR0cjEuZ2V0TmFtZSgpLmVxdWFscyhhdHRyMi5nZXROYW1lKCkpKXsKLQkJCQkJcmV0dXJuIG1pc21hdGNoKCJBdHRyLmdldE5hbWUoKSAiICsgYXR0cjEuZ2V0TmFtZSgpICsgIiAiICsgYXR0cjIuZ2V0TmFtZSgpLCBhdHRyMSwgYXR0cjIpOwotCQkJCX0KLQkJCQlpZihhdHRyaWJ1dGVMaXN0ICE9IG51bGwgJiYgIWF0dHJpYnV0ZUxpc3QuY29udGFpbnMoYXR0cjEuZ2V0TmFtZSgpKSAmJiAhYXR0cmlidXRlTGlzdC5jb250YWlucyhhdHRyMi5nZXROYW1lKCkpKSB7Ci0JICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHRzID0gY29tcGFyZU5vZGVzKGF0dHIxLCBhdHRyMik7Ci0JICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHJlc3VsdHMpIHsKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwotCSAgICAgICAgICAgICAgICB9Ci0JCQkJfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlczEgIT0gbnVsbCB8fCBhdHRyaWJ1dGVzMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goImdldEF0dHJpYnV0ZXMoKSBudWxsIiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgfQotCi0gICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuMSA9IG5vZGUxLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4yID0gbm9kZTIuZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgICAgIC8vICAgICAgICBpZiAoY2hpbGRyZW4xLmdldExlbmd0aCgpICE9IGNoaWxkcmVuMi5nZXRMZW5ndGgoKSkgewotICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpICIrY2hpbGRyZW4xLmdldExlbmd0aCgpKyIgIitjaGlsZHJlbjIuZ2V0TGVuZ3RoKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIC8vICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNvdW50MSA9IDA7Ci0gICAgICAgIGludCBjb3VudDIgPSAwOwotCi0gICAgICAgIC8vY29tcGFyZSBhbGwgY2hpbGRyZW4sIHNraXBwaW5nIGVtcHR5IHRleHQgbm9kZXMKLSAgICAgICAgd2hpbGUgKGNvdW50MSA8IGNoaWxkcmVuMS5nZXRMZW5ndGgoKSAmJiBjb3VudDIgPCBjaGlsZHJlbjIuZ2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQxID0gY2hpbGRyZW4xLml0ZW0oY291bnQxKTsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQyID0gY2hpbGRyZW4yLml0ZW0oY291bnQyKTsKLSAgICAgICAgICAgIGlmIChjaGlsZDEuZ2V0Tm9kZVR5cGUoKSAhPSBjaGlsZDIuZ2V0Tm9kZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIGlmIChjaGlsZDEuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAoY2hpbGQxLmdldE5vZGVWYWx1ZSgpID09IG51bGwgfHwgY2hpbGQxLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5lcXVhbHMoIiIpKSkgewotICAgICAgICAgICAgICAgICAgICBjb3VudDErKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZDIuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAoY2hpbGQyLmdldE5vZGVWYWx1ZSgpICE9IG51bGwgfHwgY2hpbGQyLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5lcXVhbHMoIiIpKSkgewotICAgICAgICAgICAgICAgICAgICBjb3VudDIrKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY291bnQxKys7Ci0gICAgICAgICAgICBjb3VudDIrKzsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHRzID0gY29tcGFyZU5vZGVzKGNoaWxkMSwgY2hpbGQyKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IHJlc3VsdHMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL1RPRE8gdGhlcmUgbXVzdCBiZSBhIHdheSB0byB0ZWxsIHRoZSBwYXJzZXIgdG8gaWdub3JlIHdoaXRlc3BhY2UuCi0gICAgICAgIC8vYmUgc3VyZSBza2lwIGFueSBlbXB0eSB0ZXh0IG5vZGVzIGF0IHRoZSBlbmQKLSAgICAgICAgd2hpbGUgKGNvdW50MSA8IGNoaWxkcmVuMS5nZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgTm9kZSBjaGlsZDEgPSBjaGlsZHJlbjEuaXRlbShjb3VudDEpOwotICAgICAgICAgICAgaWYgKGNoaWxkMS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkMS5nZXROb2RlVmFsdWUoKSA9PSBudWxsIHx8IGNoaWxkMS5nZXROb2RlVmFsdWUoKS50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGNvdW50MSsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5vZGVOb3RDb21wYXJlZChjaGlsZDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGNvdW50MiA8IGNoaWxkcmVuMi5nZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgTm9kZSBjaGlsZDIgPSBjaGlsZHJlbjIuaXRlbShjb3VudDIpOwotICAgICAgICAgICAgaWYgKGNoaWxkMi5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkMi5nZXROb2RlVmFsdWUoKSA9PSBudWxsIHx8IGNoaWxkMi5nZXROb2RlVmFsdWUoKS50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGNvdW50MisrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5vZGVOb3RDb21wYXJlZChjaGlsZDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4xLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgLy8gICAgICAgICAgICBOb2RlIGNoaWxkMSA9IGNoaWxkcmVuMS5pdGVtKGkpOwotICAgICAgICAvLyAgICAgICAgICAgIE5vZGUgY2hpbGQyID0gY2hpbGRyZW4yLml0ZW0oaSk7Ci0gICAgICAgIC8vICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbnVsbE5vZGVFbmNvdW50ZXJlZChOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gIk51bGwgbm9kZSBlbmNvdW50ZXJlZCI7Ci0JCU5vZGUgbm9uTnVsbE5vZGUgPSBub2RlMSA9PSBudWxsID8gbm9kZTIgOiBub2RlMTsKLQkJY2hhciBzb3VyY2UgPSBub2RlMSA9PSBudWxsID8gJ0InIDogJ0EnOwotCQl3aGlsZSAobm9uTnVsbE5vZGUgIT0gbnVsbCkgewotCQkJbWVzc2FnZSArPSBzb3VyY2UgKyBub25OdWxsTm9kZS5nZXROb2RlTmFtZSgpICsgIlxuIjsKLQkJCW5vbk51bGxOb2RlID0gbm9uTnVsbE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlOwotCi0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vZGVOb3RDb21wYXJlZChOb2RlIG5vZGUpIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTm9kZSBub2RlIGNvbXBhcmVkOiI7Ci0gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgKz0gbm9kZS5nZXROb2RlTmFtZSgpICsgIlxuIjsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc21hdGNoKFN0cmluZyBtaXNtYXRjaHR5cGUsIE5vZGUgbm9kZTEsIE5vZGUgbm9kZTIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJOb2RlcyBBIGFuZCBCIGRvIG5vdCBtYXRjaCBiZWNhdXNlIG9mIG5vZGUuIiArIG1pc21hdGNodHlwZSArICJcbiI7Ci0gICAgICAgIHdoaWxlIChub2RlMSAhPSBudWxsICYmIG5vZGUyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgKz0gIkE6IiArIG5vZGUxLmdldE5vZGVOYW1lKCkgKyAiXG4iOwotICAgICAgICAgICAgbWVzc2FnZSArPSAiQjoiICsgbm9kZTIuZ2V0Tm9kZU5hbWUoKSArICJcbiI7Ci0gICAgICAgICAgICBub2RlMSA9IG5vZGUxLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIG5vZGUyID0gbm9kZTIuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIH0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKLQkJcmV0dXJuIGVudGl0eVJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvbHZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFbnRpdHlSZXNvbHZlcihFbnRpdHlSZXNvbHZlciByZXNvbHZlcikgewotCQllbnRpdHlSZXNvbHZlciA9IHJlc29sdmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0luaXRpYWxpemF0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Jbml0aWFsaXphdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NGM0ZjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0luaXRpYWxpemF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0gLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzE4LzAwIDc6NDE6MzkgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsaXphdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMS4iOy8vJE5PTi1OTFMtMSQKLS8qKgotICogSW5pdGlhbGl6YXRpb25UZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgSW5pdGlhbGl6YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLX0KLS8qKgotICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5Jbml0aWFsaXphdGlvblRlc3RzIiwgIi1ub2xvYWRpbmcifTsKLQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBUZXN0U3VpdGUoSW5pdGlhbGl6YXRpb25UZXN0cy5jbGFzcyk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0TmV3QXJjaGl2ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotLy8gICAgICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCIqIiwgbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JQXBwbGljYXRpb25DbGllbnRGaWxlIGNsaWVudEZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUluaXRpYWxpemVkKCJmb28iKTsKLQlhc3NlcnRUcnVlKGNsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQkKLQotCWNsaWVudEZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUluaXRpYWxpemVkKCJmb28iKTsKLQotCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKCJmb28iKTsKLQlhc3NlcnRUcnVlKGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQkKLQkvL1RoZSBuZXh0IHBpZWNlIGlzIHRvIHZlcmlmeSBubyBleGNlcHRpb25zIG9jY3VyCi0JZWpiSmFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKCJmb28iKTsKLQlFSkJNb2R1bGVSZWYgZWpiTW9kdWxlUmVmID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFSkJNb2R1bGVSZWYoKTsKLQllamJNb2R1bGVSZWYuc2V0TW9kdWxlRmlsZShlamJKYXJGaWxlKTsKLQkKLQotCUVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKCJmb28iKTsKLQkKLQlhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQkKLQotCVdBUkZpbGUgd2FyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlV0FSRmlsZUluaXRpYWxpemVkKCJmb28iKTsKLQkKLQlhc3NlcnRUcnVlKHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQkKLQotCXdhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdBUkZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0JV2ViTW9kdWxlUmVmIHdlYk1vZHVsZVJlZiA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlV2ViTW9kdWxlUmVmKCk7Ci0Jd2ViTW9kdWxlUmVmLnNldE1vZHVsZUZpbGUod2FyRmlsZSk7Ci0JCi0KLX0KLQkKLQkKLQotCi0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvSmF2YVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvSmF2YVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMzNiZDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0phdmFUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLSAvKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0gKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEvMTcvMjAwMSAxMDoxNzoyOSBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsvLyROT04tTkxTLTEkCi0vKioKLSAqIEphdmFUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgSmF2YVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotfQotLyoqCi0gKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotICovCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkphdmFUZXN0cyIsICItbm9sb2FkaW5nIn07Ci0JVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgVGVzdFN1aXRlKEphdmFUZXN0cy5jbGFzcyk7Ci19Ci0vKioKLSAqIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgamF2YSByZWZsZWN0aW9uIHdvcmtzIG9uIGFyY2hpdmVzLCBhbmQgdGhhdAotICogY2xhc3MgbG9hZGluZyBhbmQgamF2YSByZWZsZWN0aW9uIGlzIGR5bmFtaWMgd2l0aCBjaGFuZ2VzIHRvIHRoZSBjbGFzcwotICogcGF0aCBvZiB0aGUgYXJjaGl2ZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0SmF2YVJlZmxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8qCi0JQXJjaGl2ZSBhbkFyY2hpdmUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLnByaW1PcGVuQXJjaGl2ZSgiYmFuazM1ZGVwbG95ZWQuamFyIik7Ci0JSmF2YUNsYXNzIGNscyA9IChKYXZhQ2xhc3Mpb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW1wbC5KYXZhQ2xhc3NJbXBsLnJlZmxlY3QoImNvbS5pYm0uZWpiLmJhbmsuVmFwQWNjb3VudEJlYW4iLCBhbkFyY2hpdmUuZ2V0Q29udGV4dCgpKTsKLQkvL0lnbm9yZSB0aGUgY29uc3RydWN0b3IKLQlhc3NlcnRUcnVlKCJTaG91bGQgbm90IGhhdmUgYmVlbiBhYmxlIHRvIHJlZmxlY3QgbWV0aG9kcyIgLGNscy5nZXRNZXRob2RzKCkuc2l6ZSgpID09IDEgJiYgKChNZXRob2QpY2xzLmdldE1ldGhvZHMoKS5nZXQoMCkpLmdldE5hbWUoKS5lcXVhbHMoY2xzLmdldE5hbWUoKSkpOwotCi0JYW5BcmNoaXZlLnNldEV4dHJhQ2xhc3NwYXRoKCJpdmplamIzNS5qYXIiKTsKLQotCWFzc2VydFRydWUoIk1ldGhvZHMgc2hvdWxkIGhhdmUgYmVlbiByZWZsZWN0ZWQiLCBjbHMuZ2V0TWV0aG9kcygpLnNpemUoKSA+IDEpOwotKi8JCi19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvTG9vc2VBcmNoaXZlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Mb29zZUFyY2hpdmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmViMzdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Mb29zZUFyY2hpdmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVJbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ1JlZ2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VXQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotCi0KLXB1YmxpYyBjbGFzcyBMb29zZUFyY2hpdmVUZXN0cyBleHRlbmRzIEFic3RyYWN0QXJjaGl2ZVRlc3QgewotCi0JLyoqIFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICovCi0JcHJvdGVjdGVkIFN0cmluZyBjd2Q7Ci0JcHJvdGVjdGVkIFVSSSBsb29zZUNvbmZpZ0xvYzsKLQlwcm90ZWN0ZWQgVVJJIGxvb3NlQXBwTG9jOwotCXByb3RlY3RlZCBTdHJpbmcgbG9vc2VNb2R1bGVXb3Jrc3BhY2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBsb29zZUVBUlVyaTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfSkFSX1VSSSA9ICJMb29zZUVBUkVqYi5qYXIiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9VUkkgPSAiTG9vc2VFQVJXZWIud2FyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVVElMX0pBUl9VUkkgPSAidXRpbC5qYXIiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkxJQl9VUkkgPSAiV0VCLUlORi9saWIvbGlicmFyeS5qYXIiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkxJQl9GVUxMX1VSSSA9ICJXRUItSU5GL2xpYi9saWJyYXJ5LmphciI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0VBUl9GSUxFX1VSSSA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9Mb29zZUFyY2hpdmVUZXN0cy9Mb29zZUFwcC5lYXIiOwotCXByb3RlY3RlZCBzdGF0aWMgY2hhciBzZXAgPSBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTG9vc2VBcmNoaXZlVGVzdHMuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgTG9vc2VBcmNoaXZlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb29zZUNvbmZpZ0NyZWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KGxvb3NlQ29uZmlnTG9jKS5jcmVhdGVSZXNvdXJjZShsb29zZUNvbmZpZ0xvYyk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZUxvb3NlQ29uZmlnKCkpOwotCQlyZXNvdXJjZS5zYXZlKG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExvb3NlQXBwQ3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkobG9vc2VBcHBMb2MpLmNyZWF0ZVJlc291cmNlKGxvb3NlQXBwTG9jKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoY3JlYXRlTG9vc2VBcHBsaWNhdGlvbigpKTsKLQkJcmVzb3VyY2Uuc2F2ZShuZXcgamF2YS51dGlsLkhhc2hNYXAoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb29zZUNvbmZpZ09wZW5BbmRTYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eShMb29zZUNvbmZpZ1JlZ2lzdGVyLkxPT1NFX0NPTkZJR19QUk9QRVJUWSwgbG9vc2VDb25maWdMb2MudG9TdHJpbmcoKSk7Ci0JCUVBUkZpbGUgZWFyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShsb29zZUVBUlVyaSk7Ci0JCXZlcmlmeShlYXIpOwotCQkvL3ByaW50Q2xhc3NwYXRocyhlYXIpOwotCQllYXIuc2F2ZUFzKE9VVFBVVF9FQVJfRklMRV9VUkkpOwotCQllYXIuY2xvc2UoKTsKLQkJZWFyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShPVVRQVVRfRUFSX0ZJTEVfVVJJKTsKLQkJdmVyaWZ5KGVhcik7Ci0JCWVhci5jbG9zZSgpOwotCQkJCi0JfQotCQotCi0JCi0JcHVibGljIHZvaWQgdGVzdExvb3NlQ29uZmlnVW5pbW9kZU9wZW5BbmRTYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eShMb29zZUNvbmZpZ1JlZ2lzdGVyLkxPT1NFX0NPTkZJR19QUk9QRVJUWSwgIiIpOwotCi0JCUxvb3NlQ29uZmlnUmVnaXN0ZXIuc2luZ2xldG9uKCkuYWRkTG9vc2VNYXBwaW5nKGxvb3NlRUFSVXJpLCBsb29zZUFwcExvYy50b1N0cmluZygpKTsKLQkJRUFSRmlsZSBlYXIgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGxvb3NlRUFSVXJpKTsKLQkJdmVyaWZ5KGVhcik7Ci0JCS8vcHJpbnRDbGFzc3BhdGhzKGVhcik7Ci0JCWVhci5zYXZlQXMoT1VUUFVUX0VBUl9GSUxFX1VSSSk7Ci0JCWVhci5jbG9zZSgpOyAKLQotCQllYXIgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKE9VVFBVVF9FQVJfRklMRV9VUkkpOwotCQl2ZXJpZnkoZWFyKTsKLQkJZWFyLmNsb3NlKCk7Ci0JCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExvb3NlQ29uZmlnT3BlbkFuZFJlT3BlbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0uc2V0UHJvcGVydHkoTG9vc2VDb25maWdSZWdpc3Rlci5MT09TRV9DT05GSUdfUFJPUEVSVFksIGxvb3NlQ29uZmlnTG9jLnRvU3RyaW5nKCkpOwotCQlFQVJGaWxlIGVhciA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUobG9vc2VFQVJVcmkpOwotCQllYXIuY2xvc2UoKTsKLQkJZWFyLnJlb3BlbigpOwotCQlMaXN0IGphcnMgPSBlYXIuZ2V0QXJjaGl2ZUZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamFycy5zaXplKCk7IGkrKykgewotCQkJQXJjaGl2ZSBhcmNoaXZlID0gKEFyY2hpdmUpIGphcnMuZ2V0KGkpOwotCQkJYXJjaGl2ZS5jbG9zZSgpOwotCQkJYXJjaGl2ZS5yZW9wZW4oZWFyKTsKLQkJfQotCQllYXIuY2xvc2UoKTsKLQkJCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeShFQVJGaWxlIGVhcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXZlcmlmeU1vZHVsZXMoZWFyKTsKLQkJdmVyaWZ5TW9kdWxlUmVmcyhlYXIpOwotCQl2ZXJpZnlVdGlsQW5kTGliKGVhcik7Ci0JfQotCi0JLyoqCi0JICogQW5vdGhlciBsZXZlbCBvZiB2ZXJpZmljYXRpb24gdGhhdCBmb3IgZWFjaCBtb2R1bGUsIHRoZSBtb2R1bGUgZmlsZXMgZXhpc3RzCi0JICogYW5kIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY2FuIGJlIHJlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlNb2R1bGVSZWZzKEVBUkZpbGUgZWFyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdCBtb2R1bGVSZWZzID0gZWFyLmdldE1vZHVsZVJlZnMoKTsKLQkJaW50IHNpemUgPSBtb2R1bGVSZWZzLnNpemUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgbW9kdWxlcyIsIDIsIHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTW9kdWxlUmVmIHJlZiA9IChNb2R1bGVSZWYpIG1vZHVsZVJlZnMuZ2V0KGkpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTW9kdWxlUmVmIHNob3VsZCBoYXZlIGEgbW9kdWxlIGZpbGU6IityZWYuZ2V0TW9kdWxlKCkuZ2V0VXJpKCksIHJlZi5nZXRNb2R1bGVGaWxlKCkpOwotCQkJYXNzZXJ0Tm90TnVsbCgiRGVwbG95bWVudCBkZXNjcmlwdG9yIHNob3VsZCBub3QgYmUgbnVsbCIsIHJlZi5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpKTsJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZ5IHRoYXQgdGhlIHV0aWwgamFyIGluIHRoZSBlYXIgYW5kIHRoZSBsaWJyYXJ5IGluIHRoZSB3YXIgZXhpc3QgYW5kIGFyZSBub3QgZW1wdHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlVdGlsQW5kTGliKEVBUkZpbGUgZWFyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdmVyaWZ5SkFSKGVhciwgVVRJTF9KQVJfVVJJKTsKLQkJdmVyaWZ5SkFSKChBcmNoaXZlKWVhci5nZXRGaWxlKFdBUl9VUkkpLCBXRUJMSUJfRlVMTF9VUkkpOwotCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlKQVIoQXJjaGl2ZSBwYXJlbnQsIFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCJTaG91bGQgY29udGFpbiBKQVI6ICIrdXJpLCBwYXJlbnQuY29udGFpbnNGaWxlKHVyaSkpOwotCQlBcmNoaXZlIGphciA9IChBcmNoaXZlKXBhcmVudC5nZXRGaWxlKHVyaSk7Ci0JCS8vYXQgbGVhc2Ugb25lIGZpbGUgcGx1cyB0aGUgbWFuaWZlc3QKLQkJYXNzZXJ0VHJ1ZSgiSkFSIHNob3VsZCBjb250YWluIGEgY2xhc3MgZmlsZTogIit1cmksIGNvbnRhaW5zQ2xhc3NGaWxlKGphcikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0NsYXNzRmlsZShBcmNoaXZlIGphcikgewotCQlMaXN0IGZpbGVzID0gamFyLmdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmdldFVSSSgpLmVuZHNXaXRoKCIuY2xhc3MiKSk7Ci0JCQkJcmV0dXJuIHRydWU7CQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogTWFrZSBzdXJlIHtAbGluayBDb250YWluZXIjY29udGFpbnNGaWxlKFN0cmluZykgd29ya3MgZm9yIGxvb3NlIG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB2ZXJpZnlNb2R1bGVzKEVBUkZpbGUgZWFyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdCBtb2R1bGVzID0gZWFyLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotCQlpbnQgc2l6ZSA9IG1vZHVsZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBtID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlhc3NlcnRUcnVlKCJFQVIgZmlsZSBzaG91bGQgY29udGFpbiBtb2R1bGUgZmlsZTogIittLmdldFVyaSgpLCBlYXIuY29udGFpbnNGaWxlKG0uZ2V0VXJpKCkpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBtb2R1bGVzIiwgMiwgc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlIG0gPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCWFzc2VydFRydWUoIkVBUiBmaWxlIHNob3VsZCBjb250YWluIG1vZHVsZSBmaWxlOiAiK20uZ2V0VXJpKCksIGVhci5jb250YWluc0ZpbGUobS5nZXRVcmkoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBMb29zZUNvbmZpZ3VyYXRpb24gY3JlYXRlTG9vc2VDb25maWcoKSB7Ci0JCUxvb3NlQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb29zZUNvbmZpZ0ZhY3RvcnkoKS5jcmVhdGVMb29zZUNvbmZpZ3VyYXRpb24oKTsKLQkJY29uZmlnLmdldEFwcGxpY2F0aW9ucygpLmFkZChjcmVhdGVMb29zZUFwcGxpY2F0aW9uKCkpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLQlwcm90ZWN0ZWQgTG9vc2VBcHBsaWNhdGlvbiBjcmVhdGVMb29zZUFwcGxpY2F0aW9uKCkgewotCQlMb29zZUFwcGxpY2F0aW9uIGFwcCA9IGxvb3NlQ29uZmlnRmFjdG9yeSgpLmNyZWF0ZUxvb3NlQXBwbGljYXRpb24oKTsKLQkJYXBwLnNldFVyaShsb29zZUVBUlVyaSk7Ci0JCWFwcC5zZXRSZXNvdXJjZXNQYXRoKGxvb3NlRUFSVXJpKTsKLQkJYXBwLnNldEJpbmFyaWVzUGF0aChsb29zZUVBUlVyaSk7Ci0JCUxpc3QgbG9vc2VBcmNoaXZlcyA9IGFwcC5nZXRMb29zZUFyY2hpdmVzKCk7Ci0JCWxvb3NlQXJjaGl2ZXMuYWRkKGNyZWF0ZUxvb3NlRUpCKCkpOwotCQlsb29zZUFyY2hpdmVzLmFkZChjcmVhdGVMb29zZVdFQigpKTsKLQkJbG9vc2VBcmNoaXZlcy5hZGQoY3JlYXRlTG9vc2VVdGlsKCkpOwotCQlyZXR1cm4gYXBwOwotCX0KLQkKLQlwcm90ZWN0ZWQgTG9vc2VNb2R1bGUgY3JlYXRlTG9vc2VFSkIoKSB7Ci0JCUxvb3NlTW9kdWxlIG1vZCA9IGxvb3NlQ29uZmlnRmFjdG9yeSgpLmNyZWF0ZUxvb3NlTW9kdWxlKCk7Ci0JCW1vZC5zZXRVcmkoRUpCX0pBUl9VUkkpOwotCQlTdHJpbmcgYWJzUGF0aCA9IGxvb3NlTW9kdWxlV29ya3NwYWNlK3NlcCsiTG9vc2VFQVJFamIiK3NlcCsiYmluIjsKLQkJbW9kLnNldEJpbmFyaWVzUGF0aChhYnNQYXRoKTsKLQkJbW9kLnNldFJlc291cmNlc1BhdGgoYWJzUGF0aCk7Ci0JCXJldHVybiBtb2Q7Ci0JfQotCQotCXByb3RlY3RlZCBMb29zZU1vZHVsZSBjcmVhdGVMb29zZVdFQigpIHsKLQkJTG9vc2VXQVJGaWxlIG1vZCA9IGxvb3NlQ29uZmlnRmFjdG9yeSgpLmNyZWF0ZUxvb3NlV0FSRmlsZSgpOwotCQltb2Quc2V0VXJpKFdBUl9VUkkpOwotCQlTdHJpbmcgYWJzUGF0aCA9IGxvb3NlTW9kdWxlV29ya3NwYWNlK3NlcCsiTG9vc2VFQVJXZWIiK3NlcCsid2ViQXBwbGljYXRpb24iOwotCQltb2Quc2V0QmluYXJpZXNQYXRoKGFic1BhdGgpOwotCQltb2Quc2V0UmVzb3VyY2VzUGF0aChhYnNQYXRoKTsKLQkJbW9kLmdldExvb3NlTGlicygpLmFkZChjcmVhdGVMb29zZVdlYkxpYigpKTsKLQkJcmV0dXJuIG1vZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvb3NlTGlicmFyeSBjcmVhdGVMb29zZVV0aWwoKSB7Ci0JCUxvb3NlTGlicmFyeSBsaWIgPSBsb29zZUNvbmZpZ0ZhY3RvcnkoKS5jcmVhdGVMb29zZUxpYnJhcnkoKTsKLQkJbGliLnNldFVyaShVVElMX0pBUl9VUkkpOwotCQlTdHJpbmcgYWJzUGF0aCA9IGxvb3NlTW9kdWxlV29ya3NwYWNlK3NlcCsiTG9vc2VKYXZhVXRpbCIrc2VwKyJiaW4iOwotCQlsaWIuc2V0QmluYXJpZXNQYXRoKGFic1BhdGgpOwotCQlsaWIuc2V0UmVzb3VyY2VzUGF0aChhYnNQYXRoKTsKLQkJcmV0dXJuIGxpYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvb3NlTGlicmFyeSBjcmVhdGVMb29zZVdlYkxpYigpIHsKLQkJTG9vc2VMaWJyYXJ5IGxpYiA9IGxvb3NlQ29uZmlnRmFjdG9yeSgpLmNyZWF0ZUxvb3NlTGlicmFyeSgpOwotCQlsaWIuc2V0VXJpKFdFQkxJQl9VUkkpOwotCQlTdHJpbmcgYWJzUGF0aCA9IGxvb3NlTW9kdWxlV29ya3NwYWNlK3NlcCsiTG9vc2VKYXZhV2ViTGliIitzZXArImJpbiI7Ci0JCWxpYi5zZXRCaW5hcmllc1BhdGgoYWJzUGF0aCk7Ci0JCWxpYi5zZXRSZXNvdXJjZXNQYXRoKGFic1BhdGgpOwotCQlyZXR1cm4gbGliOwotCX0KLQkKLQlwcm90ZWN0ZWQgTG9vc2Vjb25maWdGYWN0b3J5IGxvb3NlQ29uZmlnRmFjdG9yeSgpIHsKLQkJcmV0dXJuIExvb3NlY29uZmlnUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9vc2Vjb25maWdGYWN0b3J5KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByaW50Q2xhc3NwYXRocyhFQVJGaWxlIGVhcikgewotCQlMaXN0IGFyY2hpdmVzID0gZWFyLmdldEFyY2hpdmVGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyY2hpdmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlBcmNoaXZlIGFyY2hpdmUgPSAoQXJjaGl2ZSkgYXJjaGl2ZXMuZ2V0KGkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbCBydW50aW1lIGNsYXNzcGF0aCBmb3I6ICIrYXJjaGl2ZS5nZXRVUkkoKSk7Ci0JCQlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gYXJjaGl2ZS5nZXRMb2NhbFJ1bnRpbWVDbGFzc1BhdGgoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlbnRyaWVzW2pdKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRnVsbCBydW50aW1lIGNsYXNzcGF0aCBmb3I6ICIrYXJjaGl2ZS5nZXRVUkkoKSk7Ci0JCQllbnRyaWVzID0gYXJjaGl2ZS5nZXRGdWxsUnVudGltZUNsYXNzUGF0aCgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGVudHJpZXNbal0pOwotCQkJfQotCQl9Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuTG9vc2VBcmNoaXZlVGVzdHMiLCAiLW5vbG9hZGluZyIgfTsKLQkJVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJMb29zZUFyY2hpdmVUZXN0cyIpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBMb29zZUFyY2hpdmVUZXN0cygidGVzdExvb3NlQ29uZmlnQ3JlYXRpb24iKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IExvb3NlQXJjaGl2ZVRlc3RzKCJ0ZXN0TG9vc2VBcHBDcmVhdGlvbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgTG9vc2VBcmNoaXZlVGVzdHMoInRlc3RMb29zZUNvbmZpZ09wZW5BbmRTYXZlIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBMb29zZUFyY2hpdmVUZXN0cygidGVzdExvb3NlQ29uZmlnT3BlbkFuZFJlT3BlbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgTG9vc2VBcmNoaXZlVGVzdHMoInRlc3RMb29zZUNvbmZpZ1VuaW1vZGVPcGVuQW5kU2F2ZSIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkJLyoKLQkJICogQHNlZSBUZXN0Q2FzZSNzZXRVcCgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQkJc3VwZXIuc2V0VXAoKTsKLQkJCUFyY2hpdmVJbml0LmluaXQoKTsKLQkJCUxvb3NlQ29uZmlnUmVnaXN0ZXIuc2luZ2xldG9uKCkuZmx1c2goKTsKLQkJCWN3ZCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotCQkJbG9vc2VNb2R1bGVXb3Jrc3BhY2UgPSBjd2QrImxvb3NlX21vZHVsZV93b3Jrc3BhY2UiOwotCQkJbG9vc2VDb25maWdMb2MgPSBVUkkuY3JlYXRlRmlsZVVSSShsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIi5tZXRhZGF0YSIrc2VwKyIucGx1Z2lucyIrc2VwKyJjb20uaWJtLmV0b29scy5qMmVlIitzZXArImxvb3NlQ29uZmlnLnhtaSIpOwotCQkJbG9vc2VBcHBMb2MgPSBVUkkuY3JlYXRlRmlsZVVSSShsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIi5tZXRhZGF0YSIrc2VwKyIucGx1Z2lucyIrc2VwKyJjb20uaWJtLmV0b29scy5qMmVlIitzZXArImxvb3NlQXBwLnhtaSIpOwotCQkJbG9vc2VFQVJVcmkgPSBBcmNoaXZlVXRpbC5nZXRPU1VyaShsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIkxvb3NlRUFSIik7Ci0JCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1JhckZpbGVUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1JhckZpbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM1OGQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9SYXJGaWxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotLyoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci0KLS8qKgotICogVGVzdHMgZm9yIHZlcmZpY2F0aW9uIHRoYXQgUkFSIHN1cHBvcnQgd29ya3MgY29ycmVjdGx5IGluIFdDQ00uCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMTEvMDAgMTA6MjY6MTEgQU0pCi0gKiBAYXV0aG9yOiBKYXJlZCBKdXJraWV3aWN6LCBldCBhbC4KLSAqLwotcHVibGljIGNsYXNzIFJhckZpbGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFNpbXBsZVRlc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gICAgICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBSYXJGaWxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuUmFyRmlsZVRlc3RzIiwgIi1ub2xvYWRpbmciIH07Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwcmludFJBUlRvQ29uc29sZShDb25uZWN0b3IgY29ubmVjdG9yKSB7Ci0gICAgICAgIFJlc291cmNlQWRhcHRlciByYSA9IGNvbm5lY3Rvci5nZXRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlQWRhcHRlciBmcm9tIFhNTCBEZXBsb3ltZW50IERlc2NyaXB0b3IiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjb25uZWN0b3IuZ2V0RGlzcGxheU5hbWUoKSArICI6ICIgKyBjb25uZWN0b3IuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVmVuZG9yIDogIiArIGNvbm5lY3Rvci5nZXRWZW5kb3JOYW1lKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlZlcnNpb24gOiAiICsgY29ubmVjdG9yLmdldFZlcnNpb24oKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3BlYyBWZXJzaW9uIDogIiArIGNvbm5lY3Rvci5nZXRTcGVjVmVyc2lvbigpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFSVMgVHlwZSA6ICIgKyBjb25uZWN0b3IuZ2V0RWlzVHlwZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQgOiAiICsgcmEuaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2FjdGlvbiBTdXBwb3J0IDogIiArIHJhLmdldFRyYW5zYWN0aW9uU3VwcG9ydCgpLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKLQotICAgICAgICBpZiAoY29ubmVjdG9yLmdldExpY2Vuc2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxpY2Vuc2UgUmVxdWlyZWQgOiAiICsgY29ubmVjdG9yLmdldExpY2Vuc2UoKS5pc1JlcXVpcmVkKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMaWNlbnNlIERlc2NyaXB0aW9uIDogIiArIGNvbm5lY3Rvci5nZXRMaWNlbnNlKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNtYWxsIEljb24gOiAiICsgY29ubmVjdG9yLmdldFNtYWxsSWNvbigpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMYXJnZSBJY29uIDogIiArIGNvbm5lY3Rvci5nZXRMYXJnZUljb24oKSk7Ci0KLSAgICAgICAgTGlzdCBhdXRoTWVjaHMgPSByYS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdXRoTWVjaHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIGF1dGggPSAoQXV0aGVudGljYXRpb25NZWNoYW5pc20pIGF1dGhNZWNocy5nZXQoaSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuQXV0aGVudGljYXRpb24gTWVjaGFuaXNtOiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZXNjcmlwdGlvbiA6ICIgKyBhdXRoLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlIDogIiArIGF1dGguZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmVkZW50aWFsIEludGVyZmFjZSA6ICIgKyBhdXRoLmdldENyZWRlbnRpYWxJbnRlcmZhY2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblJlZ2lzdGVyZWQgY2xhc3NlczoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyByYS5nZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpICsgIiBpbXBsZW1lbnRzICIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQiICsgcmEuZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgcmEuZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpICsgIiBpbXBsZW1lbnRzICIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQiICsgcmEuZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeTogIiArIHJhLmdldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkpOwotCi0gICAgICAgIExpc3QgY29uZmlncyA9IHJhLmdldENvbmZpZ1Byb3BlcnRpZXMoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkNvbmZpZy1wcm9wZXJ0aWVzOiIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIENvbmZpZ1Byb3BlcnR5IHByb3AgPSAoQ29uZmlnUHJvcGVydHkpIGNvbmZpZ3MuZ2V0KGkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdENvbmZpZy1wcm9wZXJ0eSA6ICIgKyBwcm9wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0VHlwZSA6ICIgKyBwcm9wLmdldFR5cGUoKSArICIgLyBWYWx1ZSA6ICIgKyBwcm9wLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdERlc2NyaXB0aW9uIDogIiArIHByb3AuZ2V0RGVzY3JpcHRpb24oKSArICJcbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBzZWNzID0gcmEuZ2V0U2VjdXJpdHlQZXJtaXNzaW9ucygpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHktUGVybWlzc2lvbnM6Iik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vjcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU2VjdXJpdHlQZXJtaXNzaW9uIHByb3AgPSAoU2VjdXJpdHlQZXJtaXNzaW9uKSBzZWNzLmdldChpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRDb25maWctRGVzY3JpcHRpb24gOiAiICsgcHJvcC5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRTcGVjaWZpY2F0aW9uIDogIiArIHByb3AuZ2V0U3BlY2lmaWNhdGlvbigpICsgIlxuIik7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSYXJGaWxlVGVzdHMuY2xhc3MpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0YWRkQ29weU1vZHVsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5yYXIiOwotICAgICAgICBSQVJGaWxlIHJhckZpbGUgPSAoUkFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0KLSAgICAgICAgcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0gICAgICAgIEVBUkZpbGUgbmV3RWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvQ29weVRlc3RzL25ld0VhcldpdGhSYXJDb3BpZWRNb2R1bGUuZWFyIik7Ci0KLSAgICAgICAgbmV3RWFyRmlsZS5hZGRDb3B5KHJhckZpbGUpOwotICAgICAgICBSQVJGaWxlIGNvcGllZCA9IChSQVJGaWxlKSBuZXdFYXJGaWxlLmdldE1vZHVsZUZpbGVzKCkuZ2V0KDApOwotICAgICAgICBhc3NlcnRUcnVlKGNvcGllZC5pc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpID09IGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5nZXQoMCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmFyRmlsZS5nZXRGaWxlcygpLnNpemUoKSA9PSBjb3BpZWQuZ2V0RmlsZXMoKS5zaXplKCkpOwotCi0gICAgICAgIG5ld0VhckZpbGUuc2F2ZU5vUmVvcGVuKCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RleHBhbmRSYXJNb2R1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUucmFyIjsKLSAgICAgICAgUkFSRmlsZSByYXJGaWxlID0gKFJBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotICAgICAgICByYXJGaWxlLnNldFVSSSgic2FtcGxlLnJhciIpOwotCi0gICAgICAgIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotICAgICAgICBFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1JhclRlc3RzL25ld0VhcldpdGhSYXJNb2R1bGUuZWFyIik7Ci0gICAgICAgIG5ld0VhckZpbGUuYWRkQ29weShyYXJGaWxlKTsKLQotICAgICAgICBuZXdFYXJGaWxlLnNhdmVOb1Jlb3BlbigpOwotCi0gICAgICAgIFN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1JhclRlc3RzL1Jhci1jb250YWluaW5nLWVhci1vdXQuZWFyIjsKLSAgICAgICAgbmV3RWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9SQVJfRklMRVMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBWZXJ5IGJhc2ljIG1ldGhvZCB0byBvcGVuIGFuIGFyY2hpdmUgYW5kIHNhdmUgaXQgYXMgYSBkaXJlY3RvcnkgdG8gYSBuZXcgZGVzdGluYXRpb24uICBSZXF1aXJlcyB2aXN1YWwgaW5zcGVjdGlvbgotICAgICAqIGZvciB2ZXJpZmljYXRpb24uICBOZXN0ZWQgd2FycyBhbmQgZWpiIGphcnMgd2lsbCBiZSBleHBsb2RlZCBidXQgb3RoZXIgbmVzdGVkIGphcnMgd2lsbCBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZEV4dHJhY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUucmFyIjsKLSAgICAgICAgUkFSRmlsZSByYXJGaWxlID0gKFJBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9FeHBsb2RlZF9SQVJfRGlyLyI7Ci0gICAgICAgIHJhckZpbGUuZXh0cmFjdFRvQ29ubmVjdG9yRGlyZWN0b3J5KG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogT3BlbnMgYW4gZWFyIGZpbGUsIGFuZCBmb3IgZWFjaCBtb2R1bGUsIHdyaXRlcyBpdCdzIGRkIGNvbXBvbmVudHMgdG8gdGhlIGNvbnNvbGUuICBSZXF1aXJlcyB2aXN1YWwgaW5zcGVjdGlvbgotICAgICAqIGZvciB2ZXJpZmljYXRpb24KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kUmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5yYXIiOwotICAgICAgICBSQVJGaWxlIHJhckZpbGUgPSAoUkFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0KLQkJQ29ubmVjdG9yIGRkID0gcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkvL3ByaW50UkFSVG9Db25zb2xlKGRkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdG9wZW5SYXJFYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdHJhci5lYXIiKTsKLQkJYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0Rmlyc3RNb2R1bGUoInNhbXBsZS5yYXIiKSAhPSBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNhdmVSYXJFYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLnJhciI7Ci0JCVJBUkZpbGUgcmFyRmlsZSA9IChSQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLQkJcmFyRmlsZS5zZXRVUkkoInNhbXBsZS5yYXIiKTsKLQotICAgICAgICByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9SYXJUZXN0cy9uZXdFYXJXaXRoUmFyTW9kdWxlX3NhdmVkLmVhciIpOwotICAgICAgICBuZXdFYXJGaWxlLmFkZENvcHkocmFyRmlsZSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTW9kdWxlIHdhc24ndCBmb3VuZCEiLCBuZXdFYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0Rmlyc3RNb2R1bGUoInNhbXBsZS5yYXIiKSk7Ci0KLSAgICAgICAgbmV3RWFyRmlsZS5zYXZlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEoyQ2F1dGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLnJhciI7Ci0gICAgICAgIFJBUkZpbGUgcmFyRmlsZSA9IChSQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLQotICAgICAgICBDb25uZWN0b3IgZGQgPSByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgUmVzb3VyY2VBZGFwdGVyIHJkID0gZGQuZ2V0UmVzb3VyY2VBZGFwdGVyKCk7Ci0KLSAgICAgICAgRUxpc3QgbXlBdXRoTGlzdCA9IHJkLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpOwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIGF1dGggbWVjaGFuaXNtcyBpczogIiArIG15QXV0aExpc3Quc2l6ZSgpKTsKLS8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG15QXV0aExpc3Quc2l6ZSgpOyBpKyspIHsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBdXRoIHR5cGUgaXM6ICIgKyAoKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKSBteUF1dGhMaXN0LmdldChpKSkuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF1dGggdHlwZSBpczogIiArICgoQXV0aGVudGljYXRpb25NZWNoYW5pc20pIG15QXV0aExpc3QuZ2V0KGkpKS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKS5nZXROYW1lKCkpOwotLy8gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9SZXNvdXJjZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvUmVzb3VyY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWNhNTEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9SZXNvdXJjZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDEzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VUZXN0cyBleHRlbmRzIEFic3RyYWN0QXJjaGl2ZVRlc3QgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nW10gY2xhc3NOYW1lID0geyJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuUmVzb3VyY2VUZXN0cyIsICItbm9sb2FkaW5nIn07Ci0JCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotCX0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXNvdXJjZVRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBmaW5kT2NjdXJyZW5jZXMoTGlzdCByZXNvdXJjZXMsIFN0cmluZyB1cmkpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJUmVzb3VyY2UgYVJlc291cmNlID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKHVyaS5lcXVhbHMoYVJlc291cmNlLmdldFVSSSgpLnRvU3RyaW5nKCkpKQotCQkJCXJlc3VsdC5hZGQoYVJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUNyZWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB1cmkgPSAiTUVUQS1JTkYvY2xpZW50LXJlc291cmNlLnhtaSI7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVJbml0aWFsaXplZCgidGVzdC5qYXIiKTsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJYm9vbGVhbiBleGNlcHRpb25DYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXJlcyA9IGFwcENsaWVudEZpbGUuZ2V0TW9mUmVzb3VyY2UodXJpKTsKLQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uQ2F1Z2h0ID0gdHJ1ZTsKLQkJCUxpc3QgZm91bmRSZXNvdXJjZXMgPSBmaW5kT2NjdXJyZW5jZXMoYXBwQ2xpZW50RmlsZS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLCB1cmkpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGV4aXN0IGV4YWN0bHkgb25lIHJlc291cmNlIiwgZm91bmRSZXNvdXJjZXMuc2l6ZSgpID09IDEpOwotCQkJUmVzb3VyY2UgZm91bmRSZXNvdXJjZSA9IChSZXNvdXJjZSlmb3VuZFJlc291cmNlcy5nZXQoMCk7Ci0JCQlhc3NlcnRGYWxzZSgiVGhlIHJlc291cmNlIHNob3VsZCBiZSB1bmxvYWRlZCIsIGZvdW5kUmVzb3VyY2UuaXNMb2FkZWQoKSk7Ci0JCQlyZXMgPSBhcHBDbGllbnRGaWxlLm1ha2VNb2ZSZXNvdXJjZSh1cmkpOwotCQkJYXNzZXJ0VHJ1ZSgiUmVzb3VyY2Ugc2hvdWxkIG5vdCBiZSBudWxsIiwgcmVzICE9IG51bGwpOwotCQkJZm91bmRSZXNvdXJjZXMgPSBmaW5kT2NjdXJyZW5jZXMoYXBwQ2xpZW50RmlsZS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLCB1cmkpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGV4aXN0IGV4YWN0bHkgb25lIHJlc291cmNlIiwgZm91bmRSZXNvdXJjZXMuc2l6ZSgpID09IDEpOwotCQkJZm91bmRSZXNvdXJjZSA9IChSZXNvdXJjZSlmb3VuZFJlc291cmNlcy5nZXQoMCk7Ci0JCQlhc3NlcnRUcnVlKCJUaGUgcmVzb3VyY2Ugc2hvdWxkIGV4aXN0IiwgZm91bmRSZXNvdXJjZSAhPSBudWxsKTsKLQkJCWFzc2VydEZhbHNlKCJUaGUgcmVzb3VyY2Ugc2hvdWxkIGJlIHVubG9hZGVkIiwgZm91bmRSZXNvdXJjZS5pc0xvYWRlZCgpKTsJCQotCQl9Ci0JCWFzc2VydFRydWUoIkV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCIsIGV4Y2VwdGlvbkNhdWdodCk7Ci0JCUNvbGxlY3Rpb24gbG9hZGVkUmVzb3VyY2VzID0gYXBwQ2xpZW50RmlsZS5nZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiTG9hZGVkIHJlc291cmNlcyBzaG91bGQgYmUgc2l6ZSAxIiwgbG9hZGVkUmVzb3VyY2VzLnNpemUoKSA9PSAxKTsKLQkJRWpiUmVmIGFSZWYgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlRWpiUmVmKCk7Ci0JCXJlcy5nZXRDb250ZW50cygpLmFkZChhUmVmKTsKLQkJbG9hZGVkUmVzb3VyY2VzID0gYXBwQ2xpZW50RmlsZS5nZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiTG9hZGVkIHJlc291cmNlcyBzaG91bGQgYmUgc2l6ZSAyIiwgbG9hZGVkUmVzb3VyY2VzLnNpemUoKSA9PSAyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlc291cmNlRGlydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRUpCSmFyRmlsZSBqYXIgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkIxMUphckZpbGUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiYmFua2VqYnMuamFyIik7Ci0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pamFyLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuZ2V0KDApOwotCQkKLQkJRUFSRmlsZSBuZXdFYXIgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZCgidGVzdCIpOwotCQlFSkJKYXJGaWxlIGNvcHlKYXIgPSAoRUpCSmFyRmlsZSkgbmV3RWFyLmFkZENvcHkoamFyKTsKLQkJCi0JCWFzc2VydEZhbHNlKCJkZCBzaG91bGQgbm90IGJlIGRpcnR5IiwgY29weUphci5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuaXNNb2RpZmllZCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCUFyY2hpdmVJbml0LmluaXQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TYXZlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TYXZlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2YzExNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvU2F2ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLS8qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJlYWRPbmx5RGlyZWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMjEvMDAgMzowNDozNiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFNhdmVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFNhdmVUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICAgICAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU2F2ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlNhdmVUZXN0cyIsICItbm9sb2FkaW5nIiB9OwotICAgICAgICBUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2F2ZVRlc3RzLmNsYXNzKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhpcyBzY2VuYXJpbyB0ZXN0cyB0aGUgY2FzZSBvZiBvcGVuaW5nIGFuIGFyY2hpdmUsIG1vZGlmeWluZyBpdCdzIGNvbnRlbnRzLCBhbmQgc2F2aW5nIHRvIHRoZSBzYW1lIHVyaSBmcm9tIHdoaWNoIGl0IHdhcwotICAgICAqIGxvYWRlZC4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIHJlYWRpbmcgb2YgaW5wdXQgc3RyZWFtcyBvZiBpbmRpdmlkdWFsIGVudHJpZXMgaW4gYW4gYXJjaGl2ZSBpcyBkZWZlcnJlZCB1bnRpbCByZXF1ZXN0ZWQgdGhyb3VnaAotICAgICAqIHRoZSBhcGkgb3Igc2F2ZSB0aW1lOyB0aGVyZWZvcmUsIGFuIG9wZW4gZmlsZSBleGlzdHMgb24gdGhlIHNvdXJjZSBmaWxlLiAgVG8gZ2V0IGFyb3VuZCB0aGlzLCB0aGUgaW1wbGVtZW50YXRpb24gc2F2ZXMgdGhlIGFyY2hpdmUKLSAgICAgKiB0byBhIHRlbXAgZmlsZSwgdGhlbiBkZWxldGVzIChvciByZW5hbWVzLCBiYXNlZCBvbiBzZXR0aW5nLCB0byBiZSBpbXBsZW1lbnRlZCkgdGhlIG9sZCBmaWxlLCByZW5hbWVzIHRoZSB0ZW1wIGZpbGUsIGFuZCBkb2VzIHNvbWUKLSAgICAgKiBob3VzZWtlZXBpbmcgb24gdGhlIHNhdmVkIGFyY2hpdmUsIHdpdGggaXQncyBsb2FkIHN0cmF0ZWd5IGFuZCBjb250YWluZWQgZmlsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vRmlyc3QgbWFrZSBhIGNvcHkgb2Ygb3VyIHJlZmVyZW5jZSBmaWxlCi0gICAgICAgIEFyY2hpdmUgYW5BcmNoaXZlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJleGFtcGxlMi53YXIiKTsKLSAgICAgICAgYW5BcmNoaXZlLnNhdmVBc05vUmVvcGVuKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvU2F2ZVRlc3RzL2NvcHkud2FyIik7Ci0gICAgICAgIGFuQXJjaGl2ZSA9IG51bGw7Ci0KLSAgICAgICAgV0FSRmlsZSBhV2FyRmlsZSA9IChXQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvU2F2ZVRlc3RzL2NvcHkud2FyIik7Ci0gICAgICAgIFJlYWRPbmx5RGlyZWN0b3J5IHNhbXBsZURpcmVjdG9yeSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlblJlYWRPbmx5RGlyZWN0b3J5KEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIldhclRlc3RDbGFzc2VzIik7Ci0gICAgICAgIGludCBpbml0aWFsU2l6ZSA9IGFXYXJGaWxlLmdldENsYXNzZXMoKS5zaXplKCk7Ci0gICAgICAgIEZpbGUgYUZpbGUgPSBzYW1wbGVEaXJlY3RvcnkuZ2V0RmlsZUluU2VsZk9yU3ViZGlyZWN0b3J5KCJjb20vaWJtL2V0b29scy9hcmNoaXZlL3Rlc3QvV0FSRmlsZVRlc3RzLmNsYXNzIik7Ci0gICAgICAgIGFXYXJGaWxlLmFkZENvcHlDbGFzcyhhRmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYVdhckZpbGUuZ2V0Q2xhc3NlcygpLnNpemUoKSA9PSBpbml0aWFsU2l6ZSArIDEpOwotCi0gICAgICAgIFN0cmluZyBjbGFzc1VSSSA9IEFyY2hpdmVVdGlsLmNvbmNhdFVyaShBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSwgYUZpbGUuZ2V0VVJJKCksICcvJyk7Ci0gICAgICAgIGFzc2VydFRydWUoYVdhckZpbGUuY29udGFpbnNGaWxlKGNsYXNzVVJJKSk7Ci0gICAgICAgIGFXYXJGaWxlLnNhdmUoKTsKLQotICAgICAgICBGaWxlIGNsYXNzRmlsZSA9IGFXYXJGaWxlLmdldEZpbGUoY2xhc3NVUkkpOwotICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHNob3VsZCBub3QgYmUgbnVsbCIsIGNsYXNzRmlsZSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgbG9hZGluZyBhcmNoaXZlIiwgY2xhc3NGaWxlLmdldExvYWRpbmdDb250YWluZXIoKSA9PSBhV2FyRmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIldyb25nIG9yaWdpbmFsIFVSSSIsIGNsYXNzRmlsZS5nZXRPcmlnaW5hbFVSSSgpLmVxdWFscyhjbGFzc1VSSSkpOwotCi0gICAgICAgIGFXYXJGaWxlLnNhdmVBcygidGVzdE91dHB1dC9TYXZlVGVzdHMvY29weTIud2FyIik7Ci0gICAgICAgIGFXYXJGaWxlLnNhdmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNjZW5hcmlvIGlzIHNpbWlsYXIgdG8gQGxpbmsgI3Rlc3RTYXZlLCBleGNlcHQgdGhhdCBpdCB0ZXN0cyB3aXRoIGEgZGlyZWN0b3J5IGluc3RlYWQgb2YgYSBqYXIgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlRGlyZWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy9GaXJzdCBtYWtlIGEgY29weSBvZiBvdXIgcmVmZXJlbmNlIGZpbGUKLSAgICAgICAgQXJjaGl2ZSBhbkFyY2hpdmUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiKTsKLSAgICAgICAgYW5BcmNoaXZlLnNhdmVBc05vUmVvcGVuKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvU2F2ZVRlc3RzL3NhbXBsZS1jb3BpZWQuZWFyIik7Ci0gICAgICAgIGFuQXJjaGl2ZSA9IG51bGw7Ci0KLSAgICAgICAgRUFSRmlsZSBhbkVBUkZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NhdmVUZXN0cy9zYW1wbGUtY29waWVkLmVhciIpOwotCi0gICAgICAgIGFuRUFSRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotICAgICAgICAKLQotICAgICAgICBhbkVBUkZpbGUuZXh0cmFjdE5vUmVvcGVuKEFyY2hpdmUuRVhQQU5EX1dBUl9GSUxFUyk7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TZWN1cml0eVJvbGVUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1NlY3VyaXR5Um9sZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzBkYzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1NlY3VyaXR5Um9sZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLSAvKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0gKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDAyLzA5LzAxIDEyOjA1OjE4IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVUZXN0IHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsvLyROT04tTkxTLTEkCi0vKioKLSAqIFNlY3VyaXR5Um9sZVRlc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBTZWN1cml0eVJvbGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIENvbW1vbkZhY3RvcnkgZ2V0Q29tbW9uRmFjdG9yeSgpIHsKLQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotfQotLyoqCi0gKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotICovCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlNlY3VyaXR5Um9sZVRlc3RzIiwgIi1ub2xvYWRpbmcifTsKLQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2VjdXJpdHlSb2xlVGVzdHMuY2xhc3MpOwotfQotcHVibGljIHZvaWQgdGVzdFB1c2hEb3duQ29weSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JRUFSRmlsZSBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIik7Ci0KLQlXQVJGaWxlIHdhckZpbGUgPSAoV0FSRmlsZSllYXJGaWxlLmdldFdBUkZpbGVzKCkuZ2V0KDApOwotCi0JRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gKEVKQkphckZpbGUpIGVhckZpbGUuZ2V0RUpCSmFyRmlsZXMoKS5nZXQoMCk7Ci0KLQlTZWN1cml0eVJvbGUgYVJvbGUgPSBnZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JYVJvbGUuc2V0Um9sZU5hbWUoImFkbWluaXN0cmF0b3IiKTsKLQlhUm9sZS5zZXREZXNjcmlwdGlvbigiVGhlIGFsbCBwb3dlcmZ1bCIpOwotCWVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKGFSb2xlKTsKLQllYXJGaWxlLnB1c2hEb3duUm9sZShhUm9sZSk7Ci0KLQlhc3NlcnRUcnVlKCJQdXNoIGRvd24gZmFpbGVkIGZvciBlamIgamFyIiwgZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZU5hbWVkKCJhZG1pbmlzdHJhdG9yIikgIT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiUHVzaCBkb3duIGZhaWxlZCBmb3Igd2FyIiwgd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZU5hbWVkKCJhZG1pbmlzdHJhdG9yIikgIT0gbnVsbCk7Ci0KLQllYXJGaWxlLmNsb3NlKCk7Ci0KLX0KLXB1YmxpYyB2b2lkIHRlc3RSb2xsdXBBZGRBbmRQdXNoRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCi0JRUFSRmlsZSBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInNhbXBsZS5lYXIiKTsKLQotCVdlYk1vZHVsZVJlZiB3ZWJSZWYgPSAoV2ViTW9kdWxlUmVmKWVhckZpbGUuZ2V0V2ViTW9kdWxlUmVmcygpLmdldCgwKTsKLQotCUVKQk1vZHVsZVJlZiBlamJNb2RSZWYgPSAoRUpCTW9kdWxlUmVmKSBlYXJGaWxlLmdldEVKQk1vZHVsZVJlZnMoKS5nZXQoMCk7Ci0KLQlTZWN1cml0eVJvbGUgYVJvbGUgPSBnZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JYVJvbGUuc2V0Um9sZU5hbWUoIkpvZSIpOwotCWFSb2xlLnNldERlc2NyaXB0aW9uKCJOZXcgZGVzY3JpcHRpb24iKTsKLQl3ZWJSZWYuZ2V0V2ViQXBwKCkuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChhUm9sZSk7Ci0KLQlhUm9sZSA9IGdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQlhUm9sZS5zZXRSb2xlTmFtZSgiYWRtaW5pc3RyYXRvciIpOwotCWFSb2xlLnNldERlc2NyaXB0aW9uKCJUaGUgYWxsIHBvd2VyZnVsIik7Ci0JCi0Jd2ViUmVmLmdldFdlYkFwcCgpLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoYVJvbGUpOwotCi0JLy9UZXN0IHRoZSByb2xsdXAKLQllYXJGaWxlLnJvbGxVcFJvbGVzKCk7Ci0JLy9XZSBjaGVhdGVkIGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IGtuZXcgdGhlcmUgd2VyZSB0d28gcm9sZXMgaW4gdGhlIGVqYiBqYXIKLQkvL29uZSBvZiB3aGljaCBpcyBuYW1lZCBKb2UsIGFuZCB6ZXJvIHJvbGVzIGluIHRoZSB3YXIgZmlsZQotCWFzc2VydFRydWUoIlJvbGwgdXAgbm90IHJpZ2h0IiwgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZXMoKS5zaXplKCkgPT0gNSk7Ci0KLQlhUm9sZSA9IGdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQlhUm9sZS5zZXRSb2xlTmFtZSgibWFuYWdlciIpOwotCWFSb2xlLnNldERlc2NyaXB0aW9uKCJ0aGUgbWFuYWdlciIpOwotCWVhckZpbGUuYWRkQ29weShhUm9sZSwgd2ViUmVmLmdldE1vZHVsZSgpKTsKLQotCS8vVGVzdCB0aGUgYWRkIGFuZCByb2xsdXAKLQlhc3NlcnRUcnVlKCJBZGQgY29weSBub3QgcmlnaHQiLCBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0U2VjdXJpdHlSb2xlcygpLnNpemUoKSA9PSA2IAotCQkmJiBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuY29udGFpbnNTZWN1cml0eVJvbGUoYVJvbGUuZ2V0Um9sZU5hbWUoKSkKLQkJJiYgd2ViUmVmLmdldFdlYkFwcCgpLmNvbnRhaW5zU2VjdXJpdHlSb2xlKGFSb2xlLmdldFJvbGVOYW1lKCkpKTsKLQotCS8vVGVzdCB0aGUgcHVzaCBkb3duCi0JZWFyRmlsZS5yZW5hbWVTZWN1cml0eVJvbGUoIkpvZSIsICJndWVzdCIpOwotCi0JYXNzZXJ0VHJ1ZSgiUHVzaCBkb3duIG5vdCByaWdodCIsICFlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuY29udGFpbnNTZWN1cml0eVJvbGUoIkpvZSIpCi0JCSYmIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5jb250YWluc1NlY3VyaXR5Um9sZSgiZ3Vlc3QiKQotCQkmJiAhd2ViUmVmLmdldFdlYkFwcCgpLmNvbnRhaW5zU2VjdXJpdHlSb2xlKCJKb2UiKQotCQkmJiB3ZWJSZWYuZ2V0V2ViQXBwKCkuY29udGFpbnNTZWN1cml0eVJvbGUoImd1ZXN0IikKLQkJJiYgIWVqYk1vZFJlZi5nZXRFSkJKYXIoKS5jb250YWluc1NlY3VyaXR5Um9sZSgiSm9lIikKLQkJJiYgZWpiTW9kUmVmLmdldEVKQkphcigpLmNvbnRhaW5zU2VjdXJpdHlSb2xlKCJndWVzdCIpKTsKLQotCWVhckZpbGUuc2F2ZUFzTm9SZW9wZW4oQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1NlY3VyaXR5Um9sZVRlc3RzL25ld1NhbXBsZS5lYXIiKTsKLQkKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TaW1wbGVUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1NpbXBsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYTg3M2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1NpbXBsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLS8qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5WYWxpZGF0ZVhtbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XZWJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuWG1sVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMTEvMDAgMTA6MjY6MTEgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFNpbXBsZVRlc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gICAgICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTaW1wbGVUZXN0cyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eShDb2xsZWN0aW9uIGFkYXB0ZXJzKSB7Ci0gICAgICAgIGlmIChhZGFwdGVycy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBpZiAoaXRlci5uZXh0KCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuU2ltcGxlVGVzdHMiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHByaW50QXBwbFRvQ29uc29sZShBcHBsaWNhdGlvbiBhcHBsKSB7Ci0KLSAgICAgICAgTGlzdCBtb2R1bGVzID0gYXBwbC5nZXRNb2R1bGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1vZHVsZXMuZ2V0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwcmludEVKQkphclRvQ29uc29sZShFSkJKYXIgZWpiSmFyKSB7Ci0KLSAgICAgICAgTGlzdCBlamJzID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVqYnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlamJzLmdldChpKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwcmludFdlYkFwcFRvQ29uc29sZShXZWJBcHAgd2ViQXBwKSB7Ci0gICAgICAgIExpc3Qgc2VydmxldHMgPSB3ZWJBcHAuZ2V0U2VydmxldHMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZsZXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmxldHMuZ2V0KGkpKTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFNpbXBsZVRlc3RzLmNsYXNzKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb25SZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICAgICAgRUpCSmFyRmlsZSBqYXJGaWxlID0gKEVKQkphckZpbGUpIGZhY3Rvcnkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiY21wc2FtcGxlLmphciIpOwotICAgICAgICBFSkJKYXIgamFyID0gamFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotICAgICAKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEVKQjExSmFyQWRkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVBUkZpbGUgX2VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1Rlc3RFQVJFSkJBZGQuZWFyIik7Ci0gICAgICAgIENvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICAgICAgRUpCSmFyRmlsZSBqYXIgPSAoRUpCSmFyRmlsZSkgZmFjdG9yeS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJlamJfY29tcGF0X2VudGl0eWNtcC5qYXIiKTsKLSAgICAgICAgamFyLnNldFVSSShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJlamJfY29tcGF0X2VudGl0eWNtcC5qYXIiKTsKLSAgICAgICAgX2VhckZpbGUuYWRkQ29weShqYXIpOwotICAgICAgICBfZWFyRmlsZS5zYXZlKCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RFSkJTZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRlc3RTbSA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIlRlc3RTY2hlbWEiOwotICAgICAgICBDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgICAgIEVKQkphckZpbGUgamFyRmlsZSA9IChFSkJKYXJGaWxlKSBmYWN0b3J5Lm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImNtcHNhbXBsZS5qYXIiKTsKLSAgICAgICAgRUpCSmFyIGphciA9IGphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgICAgICAgTGlzdCBsc3QgPSBqYXIuZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0KLSAgICAgICAgLy9JIGtub3cgdGhpcyB3aWxsIGJlIGEgQ01QLCBzbywgbGV0cyB0cnkgc2V0L2dldCBvbiBpdC4uCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGxzdC5nZXQoMCk7Ci0KLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlNldHRpbmcgU2NoZW1hIG5hbWUgdG86ICIgKyB0ZXN0U20pOwotICAgICAgICBjbXAuc2V0QWJzdHJhY3RTY2hlbWFOYW1lKHRlc3RTbSk7Ci0gICAgICAgIC8vUmV0cmlldmUgaXQgYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJHZXR0aW5nIHNjaGVtYSBuYW1lOiAiICsgY21wLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjbXAuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkuZXF1YWxzKHRlc3RTbSkpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBUaGlzIGV4Y2VyY2lzZXMgdGhlIGluZGV4IGFkYXB0ZXIgb24gQ29udGFpbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGV4aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFyY2hpdmUgYW5BcmNoaXZlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJmb28uamFyIik7Ci0gICAgICAgIFN0cmluZyB1cmkgPSAiY29tL2libS9ldG9vbHMvYXJjaGl2ZS90ZXN0L1NpbXBsZVRlc3RzLmphdmEiOwotCi0gICAgICAgIExpc3QgZmlsZXMgPSBhbkFyY2hpdmUuZ2V0RmlsZXMoKTsKLQotICAgICAgICBGaWxlIGFGaWxlID0gYW5BcmNoaXZlLmdldEZpbGUodXJpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQWRhcHRlciBzaG91bGQgYmUgYXR0YWNoZWQgdG8gYUZpbGUiLCAhaXNFbXB0eShhRmlsZS5lQWRhcHRlcnMoKSkpOwotCi0gICAgICAgIGZpbGVzLnJlbW92ZShhRmlsZSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQWRhcHRlciBzaG91bGQgbm90IGJlIGF0dGFjaGVkIHRvIGFGaWxlIiwgaXNFbXB0eShhRmlsZS5lQWRhcHRlcnMoKSkpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5zIHNob3VsZCByZXR1cm4gZmFsc2UiLCAhYW5BcmNoaXZlLmNvbnRhaW5zRmlsZSh1cmkpKTsKLQotICAgICAgICBGaWxlIGNvcHkgPSBhbkFyY2hpdmUuYWRkQ29weShhRmlsZSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgc2hvdWxkIHJldHVybiB0cnVlIiwgYW5BcmNoaXZlLmNvbnRhaW5zRmlsZSh1cmkpKTsKLQotICAgICAgICBTdHJpbmcgcmVuYW1lZFVSSSA9ICJjb20vaWJtL2dvb2JsZWR5Z29vayI7Ci0gICAgICAgIGNvcHkuc2V0VVJJKHJlbmFtZWRVUkkpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5zIHNob3VsZCByZXR1cm4gZmFsc2UgZm9yIG9sZCB1cmkiLCAhYW5BcmNoaXZlLmNvbnRhaW5zRmlsZSh1cmkpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBzaG91bGQgcmV0dXJuIHRydWUgZm9yIG5ldyB1cmkiLCBhbkFyY2hpdmUuY29udGFpbnNGaWxlKHJlbmFtZWRVUkkpKTsKLQotICAgIH0KLSAgICAvKioKLSAgICAgKiBUaGlzIGV4Y2VyY2lzZXMgdGhlIGluZGV4IGFkYXB0ZXIgb24gQ29udGFpbmVyCi0gICAgICogVGVzdHMgbm90aWZpY2F0aW9ucyB3aXRoIGFkZC9yZW1vdmUgb2YgbGlzdHMsIGFuZCB0aGF0IGFkYXB0ZXJzIGFyZSBzZXQgcG9zdCBjb3B5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGV4aW5nV2l0aENvbGxlY3Rpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFyY2hpdmUgYW5BcmNoaXZlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJiYW5rZWpicy5qYXIiKTsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiYmFyLmVhciIpOwotICAgICAgICBlYXJGaWxlLmFkZENvcHkoYW5BcmNoaXZlKTsKLSAgICAgICAgYW5BcmNoaXZlID0gKEFyY2hpdmUpIGVhckZpbGUuZ2V0RmlsZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJiYW5rZWpicy5qYXIiKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCJJbmRleCBvdXQgb2Ygc3luYyIsICFhbkFyY2hpdmUuZ2V0RmlsZXMoKS5pc0VtcHR5KCkgJiYgYW5BcmNoaXZlLmlzSW5kZXhlZCgpKTsKLSAgICAgICAgTGlzdCBmaWxlcyA9IGFuQXJjaGl2ZS5nZXRGaWxlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkluZGV4IG91dCBvZiB3aGFjazsgY29udGFpbm1lbnQgc2hvdWxkIGJlIHRydWUiLCBhbkFyY2hpdmUuY29udGFpbnNGaWxlKGFGaWxlLmdldFVSSSgpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJBZGFwdGVyIHNob3VsZCBiZSBhdHRhY2hlZCB0byBhRmlsZSIsICFpc0VtcHR5KGFGaWxlLmVBZGFwdGVycygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGZpbGVzVG9BZGQgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5SZWFkT25seURpcmVjdG9yeShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJXYXJUZXN0Q2xhc3NlcyIpLmdldEZpbGVzUmVjdXJzaXZlKCk7Ci0gICAgICAgIExpc3QgYWRkZWRGaWxlcyA9IGFuQXJjaGl2ZS5hZGRDb3B5RmlsZXMoZmlsZXNUb0FkZCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZXMgYWRkZWQgaW5jb3JyZWN0bHkiLCAhZmlsZXNUb0FkZC5pc0VtcHR5KCkgJiYgZmlsZXNUb0FkZC5zaXplKCkgPT0gYWRkZWRGaWxlcy5zaXplKCkpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkZWRGaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgRmlsZSBhRmlsZSA9IChGaWxlKSBhZGRlZEZpbGVzLmdldChpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5zIHNob3VsZCBiZSB0cnVlIiwgYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShhRmlsZS5nZXRVUkkoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHNhbWUgaW5zdGFuY2UiLCBhbkFyY2hpdmUuZ2V0RmlsZShhRmlsZS5nZXRVUkkoKSkgPT0gYUZpbGUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWRhcHRlciBzaG91bGQgYmUgYXR0YWNoZWQgdG8gYUZpbGUiLCAhaXNFbXB0eShhRmlsZS5lQWRhcHRlcnMoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGFuQXJjaGl2ZS5nZXRGaWxlcygpLnJlbW92ZUFsbChhZGRlZEZpbGVzKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZGVkRmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgYUZpbGUgPSAoRmlsZSkgYWRkZWRGaWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJBZGFwdGVyIHNob3VsZCBub3QgYmUgYXR0YWNoZWQgdG8gYUZpbGUiLCBpc0VtcHR5KGFGaWxlLmVBZGFwdGVycygpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBzaG91bGQgcmV0dXJuIGZhbHNlIiwgIWFuQXJjaGl2ZS5jb250YWluc0ZpbGUoYUZpbGUuZ2V0VVJJKCkpKTsKLSAgICAgICAgfQotICAgICAgICBnZXRBcmNoaXZlRmFjdG9yeSgpLmNsb3NlT3BlbkFyY2hpdmVzKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFZlcnkgYmFzaWMgbWV0aG9kIHRvIG9wZW4gYW4gYXJjaGl2ZSBhbmQgc2F2ZSBpdCBhcyBhIGRpcmVjdG9yeSB0byBhIG5ldyBkZXN0aW5hdGlvbi4gIFJlcXVpcmVzIHZpc3VhbCBpbnNwZWN0aW9uCi0gICAgICogZm9yIHZlcmlmaWNhdGlvbi4gIE5lc3RlZCBqYXJzIHdpbGwgbm90IGJlIGV4cGxvZGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbmRFeHRyYWN0MSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJFQVIgc3BlYyB2ZXJzaW9uICIgKyBlYXJGaWxlLmdldFNwZWNWZXJzaW9uKCkgKyAiIGRldGVjdGVkLiIpOwotCi0gICAgICAgIFN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NpbXBsZVRlc3RzL3NhbXBsZS1leHBhbmRlZC1vdXQxLmVhciI7Ci0gICAgICAgIGVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfTk9ORSk7Ci0gICAgICAgIGVhckZpbGUuY2xvc2UoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVmVyeSBiYXNpYyBtZXRob2QgdG8gb3BlbiBhbiBhcmNoaXZlIGFuZCBzYXZlIGl0IGFzIGEgZGlyZWN0b3J5IHRvIGEgbmV3IGRlc3RpbmF0aW9uLiAgUmVxdWlyZXMgdmlzdWFsIGluc3BlY3Rpb24KLSAgICAgKiBmb3IgdmVyaWZpY2F0aW9uLiAgTmVzdGVkIHdhcnMgd2lsbCBiZSBleHBsb2RlZCBidXQgb3RoZXIgbmVzdGVkIGphcnMgd2lsbCBub3QuICBUaGlzIG1ldGhvZCBlbXVsYXRlcyB0aGUgd2Vic3BoZXJlIGluc3RhbGwuCi0gICAgICogdGhlIGFyY2hpdmUgaXMgb3BlbmVkIGFzIHJlYWQgb25seTsgdGVzdCB0aGF0IG5vIHRlbXAgZmlsZXMgYXJlIGNyZWF0ZWQgYnkgcHV0dGluZyBhIGJyZWFrcG9pbnQgaW4gQXJjaGl2ZVV0aWwjY3JlYXRlVGVtcEZpbGUoU3RyaW5nLCBGaWxlKQotICAgICAqIEFsc28gdGhlIGFyY2hpdmUgaXMgb3BlbmVkIHdpdGggamF2YSByZWZsZWN0aW9uIGRpc2FibGVkLiAgVmVyaWZ5IG5vIHJlZmxlY3Rpb24gb2NjdXJzIGJ5IHB1dHRpbmcgYSBicmVha3BvaW50cyBpbiB0aGUgY29uc3RydWN0b3JzCi0gICAgICogb2YgSmF2YUpES0FkYXB0ZXJGYWN0b3J5LCBhbmQgdGhlIG1ldGhvZCByZWZsZWN0VmFsdWVzKCkgaW4gZWFjaCBvZiB0aGUgc3ViY2xhc3NlcyBvZiBKZGtBZGFwdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kRXh0cmFjdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLSAgICAgICAgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VXNlSmF2YVJlZmxlY3Rpb24oZmFsc2UpOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShvcHRpb25zLCBpbik7Ci0gICAgICAgIC8vVGhlIGZvbGxvd2luZyBjb2RlIGZvcmNlcyB0aGUgbG9hZCBvZiBhbGwgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMsIGp1c3QgdG8gbWFrZSBzdXJlIGphdmEgcmVmbGVjdGlvbiBkb2Vzbid0IGhhcHBlbgotICAgICAgICBMaXN0IG1vZHVsZVJlZnMgPSBlYXJGaWxlLmdldE1vZHVsZVJlZnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVSZWZzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNb2R1bGVSZWYgbSA9IChNb2R1bGVSZWYpIG1vZHVsZVJlZnMuZ2V0KGkpOwotICAgICAgICAgICAgbS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgb3V0ID0gInRlc3RPdXRwdXQvU2ltcGxlVGVzdHMvc2FtcGxlLWV4cGFuZGVkLW91dDIuZWFyIjsKLSAgICAgICAgZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9XQVJfRklMRVMpOwotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFZlcnkgYmFzaWMgbWV0aG9kIHRvIG9wZW4gYW4gYXJjaGl2ZSBhbmQgc2F2ZSBpdCBhcyBhIGRpcmVjdG9yeSB0byBhIG5ldyBkZXN0aW5hdGlvbi4gIFJlcXVpcmVzIHZpc3VhbCBpbnNwZWN0aW9uCi0gICAgICogZm9yIHZlcmlmaWNhdGlvbi4gIE5lc3RlZCB3YXJzIGFuZCBlamIgamFycyB3aWxsIGJlIGV4cGxvZGVkIGJ1dCBvdGhlciBuZXN0ZWQgamFycyB3aWxsIG5vdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kRXh0cmFjdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9TaW1wbGVUZXN0cy9zYW1wbGUtZXhwYW5kZWQtb3V0My5lYXIiOwotICAgICAgICBlYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX1dBUl9GSUxFUyB8IEFyY2hpdmUuRVhQQU5EX0VKQkpBUl9GSUxFUyk7Ci0gICAgICAgIGVhckZpbGUuY2xvc2UoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogT3BlbnMgYW4gZWFyIGZpbGUsIGFuZCBmb3IgZWFjaCBtb2R1bGUsIHdyaXRlcyBpdCdzIGRkIGNvbXBvbmVudHMgdG8gdGhlIGNvbnNvbGUuICBSZXF1aXJlcyB2aXN1YWwgaW5zcGVjdGlvbgotICAgICAqIGZvciB2ZXJpZmljYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZFJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotCi0gICAgICAgIEFwcGxpY2F0aW9uIGFwcGwgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAgICAgIHByaW50QXBwbFRvQ29uc29sZShhcHBsKTsKLQotICAgICAgICBMaXN0IG1vZHVsZVJlZnMgPSBlYXJGaWxlLmdldE1vZHVsZVJlZnMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZVJlZnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1vZHVsZVJlZiBhTW9kdWxlUmVmID0gKE1vZHVsZVJlZikgbW9kdWxlUmVmcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoYU1vZHVsZVJlZi5pc1dlYigpKSB7Ci0gICAgICAgICAgICAgICAgV2ViTW9kdWxlUmVmIHdSZWYgPSAoV2ViTW9kdWxlUmVmKSBhTW9kdWxlUmVmOwotICAgICAgICAgICAgICAgIHByaW50V2ViQXBwVG9Db25zb2xlKHdSZWYuZ2V0V2ViQXBwKCkpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYU1vZHVsZVJlZi5pc0VKQigpKSB7Ci0gICAgICAgICAgICAgICAgRUpCTW9kdWxlUmVmIGVSZWYgPSAoRUpCTW9kdWxlUmVmKSBhTW9kdWxlUmVmOwotICAgICAgICAgICAgICAgIHByaW50RUpCSmFyVG9Db25zb2xlKGVSZWYuZ2V0RUpCSmFyKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIFZlcnkgYmFzaWMgbWV0aG9kIHRvIG9wZW4gYW4gYXJjaGl2ZSBhbmQgc2F2ZSBpdCBhcyBhIGphciBmaWxlIHRvIGEgbmV3IGRlc3RpbmF0aW9uLiAgUmVxdWlyZXMgdmlzdWFsIGluc3BlY3Rpb24KLSAgICAgKiBmb3IgdmVyaWZpY2F0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbmRTYXZlQXNKYXJGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLSAgICAgICAgU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvU2ltcGxlVGVzdHMvc2FtcGxlLWNvcHkuZWFyIjsKLSAgICAgICAgZWFyRmlsZS5zYXZlQXNOb1Jlb3BlbihvdXQpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBUZXN0IGNhc2UgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiBhIGRlZmVjdCByZXBvcnQgdGhhdCBjdXJyZW50bHkgY2Fubm90IGJlIHJlcHJvZHVjZWQ7IG9wZW4gYW4gZXhwYW5kZWQgZWFyIGZpbGUgYW5kIHNhdmUgaXQgb3V0Ci0gICAgICogYXMgYSBqYXIgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuRGlyZWN0b3J5QW5kU2F2ZUFzSmFyRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZV9leHBhbmRlZC5lYXIiOwotICAgICAgICBpbiA9IG5ldyBqYXZhLmlvLkZpbGUoaW4pLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihpbik7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLSAgICAgICAgLy9BZGRlZCB0aGlzIGxpbmUgdG8gc2VlIGlmIGxvYWRpbmcgdGhlIGRkIHdvdWxkIG1ha2UgYSBkaWZmZXJlbmNlCi0gICAgICAgIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgICAgICAgU3RyaW5nIG91dCA9ICJ0ZXN0T3V0cHV0L1NpbXBsZVRlc3RzL3NhbXBsZS1qYXJyZWQuZWFyIjsKLSAgICAgICAgb3V0ID0gbmV3IGphdmEuaW8uRmlsZShvdXQpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihvdXQpOwotICAgICAgICBlYXJGaWxlLnNhdmVBc05vUmVvcGVuKG91dCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBzZWUgQXJjaGl2ZSNjYW5DbG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNhZmVDbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGluKTsKLSAgICAgICAgTGlzdCBtb2R1bGVzID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLSAgICAgICAgRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKSB7Ci0gICAgICAgICAgICAgICAgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBlYXJGaWxlLmdldEZpbGUoYU1vZHVsZS5nZXRVcmkoKSk7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkVKQkphciBzcGVjIHZlcnNpb24gIiArIGVqYkphckZpbGUuZ2V0U3BlY1ZlcnNpb24oKSArICIgZGV0ZWN0ZWQuIik7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUoIkVKQkphckZpbGUgc2hvdWxkIG5vdCBiZSBudWxsIiwgZWpiSmFyRmlsZSAhPSBudWxsKTsKLQotICAgICAgICBFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZCgidGVzdE91dHB1dC9TaW1wbGVUZXN0cy9zYWZlQ2xvc2UxLmVhciIpOwotICAgICAgICBuZXdFYXJGaWxlLmFkZENvcHkoZWpiSmFyRmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIWVhckZpbGUuZ2V0RGVwZW5kZW50T3BlbkFyY2hpdmVzKCkuaXNFbXB0eSgpICYmICFlamJKYXJGaWxlLmdldERlcGVuZGVudE9wZW5BcmNoaXZlcygpLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgbmV3RWFyRmlsZS5zYXZlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKS5pc0VtcHR5KCkgJiYgZWpiSmFyRmlsZS5nZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKS5pc0VtcHR5KCkpOwotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0gICAgICAgIG5ld0VhckZpbGUuY2xvc2UoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ01WQyBkZWZlY3QgOTk1NDQgLSBJZiBhIHNhdmUgZmFpbHMgYW5kIHRoZSBmaWxlIGRpZG4ndCBleGlzdCwgb25lIHNob3VsZCBub3QKLSAgICAgKiBiZSBjcmVhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVGYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0gICAgICAgIFN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NpbXBsZVRlc3RzL3NhdmVGYWlsdXJlLmVhciI7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoaW4pOwotICAgICAgICBMaXN0IG1vZHVsZXMgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotICAgICAgICBFSkJKYXJGaWxlIGVqYkphckZpbGUgPSBudWxsOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgTW9kdWxlIGFNb2R1bGUgPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpIHsKLSAgICAgICAgICAgICAgICBlamJKYXJGaWxlID0gKEVKQkphckZpbGUpIGVhckZpbGUuZ2V0RmlsZShhTW9kdWxlLmdldFVyaSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUoIkVKQkphckZpbGUgc2hvdWxkIG5vdCBiZSBudWxsIiwgZWpiSmFyRmlsZSAhPSBudWxsKTsKLQotICAgICAgICBFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChvdXQpOwotICAgICAgICBuZXdFYXJGaWxlLmFkZENvcHkoZWpiSmFyRmlsZSk7Ci0gICAgICAgIGVqYkphckZpbGUuY2xvc2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ld0VhckZpbGUuc2F2ZSgpOwotICAgICAgICB9IGNhdGNoIChTYXZlRmFpbHVyZUV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCBzYXZlIGZhaWx1cmUgb2NjdXJyZWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkZpbGUgc2hvdWxkIG5vdCBleGlzdCIsICEobmV3IGphdmEuaW8uRmlsZShvdXQpLmV4aXN0cygpKSk7Ci0gICAgICAgICAgICBnZXRBcmNoaXZlRmFjdG9yeSgpLmNsb3NlT3BlbkFyY2hpdmVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU2F2ZSBzaG91bGQgaGF2ZSBmYWlsZWQiLCBmYWxzZSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIE9wZW5zIGFuIGVhciBmaWxlLCBtYWtlcyBhIGZldyBjaGFuZ2VzIHRvIGVuc3VyZSB0aGUgeG1sIGlzIG5vdCB2YWxpZCwgYW5kIHZhbGlkYXRlcyB0aGUgeG1sIGluIGFsbCB0aGUgZGRzOyB2ZXJpZmllcyB0aGF0Ci0gICAgICogc2F4IGV4Y2VwdGlvbnMgYXJlIGNvbGxlY3RlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RYbWxWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoaW4pOwotCi0gICAgICAgIEFwcGxpY2F0aW9uIGFwcGwgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAgICAgIGFwcGwuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCkpOwotCi0gICAgICAgIExpc3QgbW9kdWxlRmlsZXMgPSBlYXJGaWxlLmdldE1vZHVsZUZpbGVzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVGaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSA9IChNb2R1bGVGaWxlKSBtb2R1bGVGaWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoYU1vZHVsZUZpbGUuaXNXQVJGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBXQVJGaWxlIGFXYXJGaWxlID0gKFdBUkZpbGUpIGFNb2R1bGVGaWxlOwotICAgICAgICAgICAgICAgIGFXYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0U2VydmxldHMoKS5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVTZXJ2bGV0KCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhTW9kdWxlRmlsZS5pc0VKQkphckZpbGUoKSkgewotICAgICAgICAgICAgICAgIEVKQkphckZpbGUgYW5FamJKYXJGaWxlID0gKEVKQkphckZpbGUpIGFNb2R1bGVGaWxlOwotICAgICAgICAgICAgICAgIGFuRWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEVudGVycHJpc2VCZWFucygpLmFkZChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCkuY3JlYXRlRW50aXR5KCkpOwotICAgICAgICAgICAgICAgIGFuRWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDb21tYW5kIGNtZCA9IG5ldyBWYWxpZGF0ZVhtbENvbW1hbmQoZWFyRmlsZSk7Ci0gICAgICAgIGNtZC5leGVjdXRlKCk7Ci0gICAgICAgIExpc3QgZXJyb3JzID0gKExpc3QpIGNtZC5nZXRSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVG90YWwgdmFsaWRhdGlvbiBlcnJvcnMgc2hvdWxkIGJlIDMsIGluc3RlYWQgb2YgIitlcnJvcnMuc2l6ZSgpLCBlcnJvcnMuc2l6ZSgpID09IDMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgWG1sVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSAoWG1sVmFsaWRhdGlvblJlc3VsdCkgZXJyb3JzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChpID09IDEpCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGVqYiBtb2R1bGUgc2hvdWxkIGhhdmUgMiBlcnJvcnMgaW5zdGVhZCBvZiAiKyByZXN1bHQuZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpLnNpemUoKSwgcmVzdWx0LmdldENhdWdodEV4Y2VwdGlvbnMoKS5zaXplKCkgPT0gMik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHdlYiBtb2R1bGUgc2hvdWxkIGhhdmUgMSBlcnJvciBpbnN0ZWFkIG9mICIrIHJlc3VsdC5nZXRDYXVnaHRFeGNlcHRpb25zKCkuc2l6ZSgpLCByZXN1bHQuZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpLnNpemUoKSA9PSAxKTsKLSAgICAgICAgfQotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIEFyY2hpdmVJbml0LmluaXQoKTsKLSAgICB9Ci0gICAgCi0gICAJcHVibGljIHZvaWQgdGVzdFJlYWRFbXB0eVRhZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgIAkJU3RyaW5nIHVyaSA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIkNIS0oyODBYLmphciI7Ci0gICAJCUVKQkphckZpbGUgamFyZmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVKQkphckZpbGUodXJpKTsKLSAgIAkJRUpCSmFyIGphciA9IGphcmZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgIAkJU2Vzc2lvbiBzZXNzID0gKFNlc3Npb24pIGphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5nZXQoMCk7Ci0gICAJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBqYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuZ2V0KDEpOwotICAgCQlhc3NlcnRGYWxzZSgiVmFsdWUgc2hvdWxkIGJlIHVuc2V0IiwgZW50aXR5LmlzU2V0UmVlbnRyYW50KCkpOwotCQlhc3NlcnRGYWxzZSgiVmFsdWUgc2hvdWxkIGJlIHVuc2V0Iiwgc2Vzcy5pc1NldFNlc3Npb25UeXBlKCkpOwotCQlhc3NlcnRGYWxzZSgiVmFsdWUgc2hvdWxkIGJlIHVuc2V0Iiwgc2Vzcy5pc1NldFRyYW5zYWN0aW9uVHlwZSgpKTsgCi19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvVGVzdEludmFsaWRYbWxNdWx0aXBsaWNpdHkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9UZXN0SW52YWxpZFhtbE11bHRpcGxpY2l0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzhkY2VkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9UZXN0SW52YWxpZFhtbE11bHRpcGxpY2l0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDIsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklXcmFwcGVkRXhjZXB0aW9uOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEludmFsaWRYbWxNdWx0aXBsaWNpdHkgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVUZXN0IHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFRlc3RJbnZhbGlkWG1sTXVsdGlwbGljaXR5KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0JICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsgImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5UZXN0SW52YWxpZFhtbE11bHRpcGxpY2l0eSIsICItbm9sb2FkaW5nIiB9OwotCQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdEludmFsaWRYbWxNdWx0aXBsaWNpdHkuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdXJpID0gIEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIkJhZEpzcENvbmZpZy53YXIiOwotCQlydW5UZXN0KHVyaSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB1cmkgPSAgQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiQmFkTG9naW5Db25maWcud2FyIjsKLQkJcnVuVGVzdCh1cmkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdXJpID0gIEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIkJhZFNlc3Npb25Db25maWcud2FyIjsKLQkJcnVuVGVzdCh1cmkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW5UZXN0KFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24gewotCQlJV3JhcHBlZEV4Y2VwdGlvbiBleCA9IG51bGw7Ci0JCVdBUkZpbGUgd2FyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuV0FSRmlsZSh1cmkpOwotCQl0cnkgewotCQkJd2FyLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCX0gY2F0Y2ggKERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiBkZGV4KSB7Ci0JCQlleCA9IGRkZXg7Ci0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgiRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IiwgZXgpOwotCQlFeGNlcHRpb24gaW5uZXIgPSBleC5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJCi0JCXdoaWxlIChleCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5uZXIgaW5zdGFuY2VvZiBJV3JhcHBlZEV4Y2VwdGlvbikgewotCQkJCWV4ID0gKElXcmFwcGVkRXhjZXB0aW9uKWlubmVyOwotCQkJCWlmIChleC5nZXROZXN0ZWRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCQlpbm5lciA9IGV4LmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQkJfSBlbHNlIAotCQkJCWV4ID0gbnVsbDsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGV4Y2VwdGlvbiBzaG91bGQgYmUgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwgaW5uZXIgaW5zdGFuY2VvZiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24pOwotCQl3YXIuY2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvVGVzdE1vZHVsZUNsYXNzTG9hZGluZy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1Rlc3RNb2R1bGVDbGFzc0xvYWRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1ZTg3NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvVGVzdE1vZHVsZUNsYXNzTG9hZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdE1vZHVsZUNsYXNzTG9hZGluZyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBzdGF0aWMgU3RyaW5nIHRlc3RDbGFzcyA9ICJjbGllbnQuU3VidHJhY3QiOwotICAgIAotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBUZXN0TW9kdWxlQ2xhc3NMb2FkaW5nKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0TW9kdWxlQ2xhc3NMb2FkaW5nKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotCXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCX0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotCSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5UZXN0TW9kdWxlQ2xhc3NMb2FkaW5nIiwgIi1ub2xvYWRpbmcifTsKLQkJVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RNb2R1bGVDbGFzc0xvYWRpbmcuY2xhc3MpOwotCX0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEFkZE1vZHVsZUNsYXNzTG9hZGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdbXSBmaWxlcyA9IHsgIlBST1RPLmVhciIsIlNFSWluQW5vdGhlckphci5lYXIiLCAiU0VJaW5XRUItSU5GX2xpYl9qYXIuZWFyIiB9OwotCi0gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogYXJncyBzcGVjaWZ5IGZ1bGwgcGF0aCB0byBlYXIgZmlsZXMuIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgLy8gY29tLmlibS53ZWJzcGhlcmUubW9kZWxzLmNvbmZpZy5pbml0LkNvbmZpZ0luaXQuaW5pdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlc1tpXTsgICAKLQkJCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpOwotCi0JCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArIGZpbGVzW2ldOwotICAgICAgICAgICAgdHJ5IHsKLQkJCQlFQVJGaWxlIGVhckZpbGUgPSBmYWN0b3J5Lm9wZW5FQVJGaWxlIChpbik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuICgidXJpOiAiICsgZWFyRmlsZS5nZXRVUkkoKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUZXN0aW5nICIgKyBlYXJGaWxlLmdldFVSSSgpKTsKLSAgICAgICAgICAgICAgICBkb01vZHVsZXMoZWFyRmlsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb01vZHVsZXMoRUFSRmlsZSBlYXJGaWxlKSB7Ci0JCUxpc3QgbW9kdWxlcyA9IGVhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlBcmNoaXZlIG1vZHVsZSA9IChBcmNoaXZlKSBtb2R1bGVzLmdldChpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIlx0TG9va2luZyBmb3IgY2xhc3MgIiArIHRlc3RDbGFzcyArICIgaW4gbW9kdWxlICIgKyBtb2R1bGUuZ2V0VVJJKCkpOwotCQkJZG9Mb2FkKG1vZHVsZSwgdGVzdENsYXNzKTsKLQkJfQotCX0gLy8gdmFsaWRhdGVNb2R1bGVzCi0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRvTG9hZChBcmNoaXZlIG1vZHVsZSwgU3RyaW5nIHRlc3RDbGFzcykgewotCQl0cnkgewotCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9Ci0JCQkJKEphdmFDbGFzcykgSmF2YUNsYXNzSW1wbC5yZWZsZWN0KHRlc3RDbGFzcywgbW9kdWxlLmdldFJlc291cmNlU2V0KCkpOwotCQkJaWYgKCEoamF2YUNsYXNzKS5pc0V4aXN0aW5nVHlwZSgpKSB7Ci0JCQkJLy8gVGhpcyBpcyB3aGF0IGhhcHBlbnMgaWYgdGhlIGNsYXNzIGNhbid0IGJlIGxvYWRlZC4KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gTk9UIEZPVU5EIC0gaXNFeGlzdGluZ1R5cGUgcmV0dXJucyBmYWxzZS4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgLSBmb3VuZDogaXNFeGlzdGluZ1R5cGUgcmV0dXJucyB0cnVlLiIpOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvV0FSRmlsZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvV0FSRmlsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzEyNmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1dBUkZpbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0gLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzE1LzAwIDI6MjY6MDQgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXQVJGaWxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7Ly8kTk9OLU5MUy0xJAotLyoqCi0gKiBXQVJGaWxlVGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIFdBUkZpbGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLX0KLS8qKgotICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5XQVJGaWxlVGVzdHMiLCAiLW5vbG9hZGluZyJ9OwotCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotfQotcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShXQVJGaWxlVGVzdHMuY2xhc3MpOwotfQotcHVibGljIHZvaWQgdGVzdEFkZENvcHlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JV0FSRmlsZSBhV2FyRmlsZSA9IChXQVJGaWxlKWdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJleGFtcGxlMi53YXIiKTsKLQotCVJlYWRPbmx5RGlyZWN0b3J5IHNhbXBsZURpcmVjdG9yeSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlblJlYWRPbmx5RGlyZWN0b3J5KEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsiV2FyVGVzdENsYXNzZXMiKTsKLQotCWludCBpbml0aWFsU2l6ZSA9IGFXYXJGaWxlLmdldENsYXNzZXMoKS5zaXplKCk7Ci0KLQlGaWxlIGFGaWxlID0gc2FtcGxlRGlyZWN0b3J5LmdldEZpbGVJblNlbGZPclN1YmRpcmVjdG9yeSgiY29tL2libS9ldG9vbHMvYXJjaGl2ZS90ZXN0L1dBUkZpbGVUZXN0cy5jbGFzcyIpOwotCi0JYVdhckZpbGUuYWRkQ29weUNsYXNzKGFGaWxlKTsKLQlhc3NlcnRUcnVlKGFXYXJGaWxlLmdldENsYXNzZXMoKS5zaXplKCkgPT0gaW5pdGlhbFNpemUrMSk7Ci0KLQlTdHJpbmcgY2xhc3NVUkkgPSBBcmNoaXZlVXRpbC5jb25jYXRVcmkoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkksIGFGaWxlLmdldFVSSSgpLCAnLycpOwotCWFzc2VydFRydWUoYVdhckZpbGUuY29udGFpbnNGaWxlKGNsYXNzVVJJKSk7Ci0JLy9TeXN0ZW0ub3V0LnByaW50bG4oYVdhckZpbGUuZ2V0VVJJKCkrIiBjb250YWlucyBjbGFzcyAiK2NsYXNzVVJJKTsKLQotCWFXYXJGaWxlLnNhdmVBc05vUmVvcGVuKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9XYXJUZXN0cy9hZGRDb3B5Q2xhc3Mud2FyIik7Ci0KLX0KLQkKLXB1YmxpYyB2b2lkIHRlc3RBZGRDb3B5TGliKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQlXQVJGaWxlIGFXYXJGaWxlID0gKFdBUkZpbGUpZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJleGFtcGxlMi53YXIiKTsKLQotCUFyY2hpdmUgbGliID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJmb28uamFyIik7Ci0KLQlpbnQgaW5pdGlhbFNpemUgPSBhV2FyRmlsZS5nZXRMaWJzKCkuc2l6ZSgpOwotCi0JYVdhckZpbGUuYWRkQ29weUxpYihsaWIpOwotCWFzc2VydFRydWUoYVdhckZpbGUuZ2V0TGlicygpLnNpemUoKSA9PSBpbml0aWFsU2l6ZSsxKTsKLQotCVN0cmluZyBsaWJVUkkgPSBBcmNoaXZlVXRpbC5jb25jYXRVcmkoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSwgbGliLmdldFVSSSgpLCAnLycpOwotCWFzc2VydFRydWUoYVdhckZpbGUuY29udGFpbnNGaWxlKGxpYlVSSSkpOwotCS8vU3lzdGVtLm91dC5wcmludGxuKGFXYXJGaWxlLmdldFVSSSgpKyIgY29udGFpbnMgbGliICIrbGliVVJJKTsKLQotCWFXYXJGaWxlLnNhdmVBc05vUmVvcGVuKCJ0ZXN0T3V0cHV0L1dhclRlc3RzL2FkZENvcHlMaWIud2FyIik7Ci0KLX0KLQkKLXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2xhc3Nlc0FuZExpYnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCVdBUkZpbGUgYVdhckZpbGUgPSAoV0FSRmlsZSlnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImV4YW1wbGUyLndhciIpOwotCi0JTGlzdCBsaWJzID0gYVdhckZpbGUuZ2V0TGlicygpOwotCUxpc3QgY2xhc3NlcyA9IGFXYXJGaWxlLmdldENsYXNzZXMoKTsKLQlMaXN0IHJlc291cmNlcyA9IGFXYXJGaWxlLmdldFJlc291cmNlcygpOwotLy8JU3lzdGVtLm91dC5wcmludGxuKCJXQVIgc3BlYyB2ZXJzaW9uICIrYVdhckZpbGUuZ2V0U3BlY1ZlcnNpb24oKSsiIGRldGVjdGVkLiIpOwotLy8JU3lzdGVtLm91dC5wcmludGxuKCJleGFtcGxlMi53YXIgY29udGFpbnMgIitjbGFzc2VzLnNpemUoKSsgIiBmaWxlcyBpbiBjbGFzc2VzIik7Ci0vLwlTeXN0ZW0ub3V0LnByaW50bG4oImV4YW1wbGUyLndhciBjb250YWlucyAiK2xpYnMuc2l6ZSgpKyAiIGxpYnMiKTsKLS8vCVN5c3RlbS5vdXQucHJpbnRsbigiZXhhbXBsZTIud2FyIGNvbnRhaW5zICIrcmVzb3VyY2VzLnNpemUoKSsgIiByZXNvdXJjZXMiKTsKLQotfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0VBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvRUF0dHJpYnV0ZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1MDA3OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvRUF0dHJpYnV0ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgYWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFQXR0cmlidXRlRGVzY3JpcHRvciB7Ci0JCi0JRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0JRUNsYXNzIG1ldGFDbGFzczsKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZURlc2NyaXB0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVDbGFzcyBtZXRhQ2xhc3MpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5tZXRhQ2xhc3MgPSBtZXRhQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0YUNsYXNzKCkgewotCQlyZXR1cm4gbWV0YUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjbGFzczEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRhQ2xhc3MoRUNsYXNzIGNsYXNzMSkgewotCQltZXRhQ2xhc3MgPSBjbGFzczE7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUVBdHRyaWJ1dGVEZXNjcmlwdG9yIG8gPSAoRUF0dHJpYnV0ZURlc2NyaXB0b3Ipb2JqZWN0OwotCQlyZXR1cm4gby5nZXRGZWF0dXJlKCkgPT0gZ2V0RmVhdHVyZSgpICYmIG8uZ2V0TWV0YUNsYXNzKCkgPT0gZ2V0TWV0YUNsYXNzKCk7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmUuaGFzaENvZGUoKSBeIG1ldGFDbGFzcy5oYXNoQ29kZSgpOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoRUF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJdGhpcy5mZWF0dXJlID0gYXR0cmlidXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0VNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYWQ1ZmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0VNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvciB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXZDbGFzc1tdOwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGNvdW50ID0gMDsKLQlwcm90ZWN0ZWQgc3RhdGljIFJhbmRvbSByYW5kb21HZW5lcmF0b3IgPSBuZXcgUmFuZG9tKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgbWF4TnVtYmVyT2ZQcm9qZWN0c0NyZWF0ZWQgPSAxMDAwOwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGVudW1NYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByb3RlY3RlZCBzdGF0aWMgaW50IHBhcmFtQ291bnQ7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBsYW5nQXJyYXkgPSBuZXcgU3RyaW5nW10geyAiRU4iLCJGUiIsIkRFIiwiSlAiLCJDTiIsIkJSIiwiU1AifTsKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBsYW5nQ291bnQgPSAwOyAgCi0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgYm9vbGVhbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgYXR0SW5kZXggPSBuZXcgSGFzaE1hcCgpOwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBzcGVjaWFsTnVtYmVyR2VuID0gZmFsc2U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgaHR0cEFycmF5W10gPSBudWxsOwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGh0dHBBcnJheUluZGV4ID0gMDsKLQkKLQlwdWJsaWMgc3RhdGljIGludCB2ZXJzaW9uOwotCXB1YmxpYyBzdGF0aWMgaW50IG1vZHVsZVR5cGU7Ci0JLy9zdGF0aWMgdmVyc2lvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfMiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzMgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV80ID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUElDQVRJT04gPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUF9DTElFTlQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RPUiA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUpCID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUIgPSA0OwotCQotICAgIHB1YmxpYyBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDb3VudCgpIHsKLSAgICAJY291bnQgPSAwOwotICAgIAlyZXR1cm47Ci0gICAgfQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZShFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBvYmopewotCQlyZXR1cm4gY3JlYXRlQXR0cmlidXRlKG5ldyBFQXR0cmlidXRlRGVzY3JpcHRvcihhdHQsb2JqLmVDbGFzcygpKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZShFQXR0cmlidXRlIGF0dCwgRUNsYXNzIGVDbGFzcyl7Ci0JCXJldHVybiBjcmVhdGVBdHRyaWJ1dGUobmV3IEVBdHRyaWJ1dGVEZXNjcmlwdG9yKGF0dCxlQ2xhc3MpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlQXR0cmlidXRlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IG9iaiwgYm9vbGVhbiBzcGVjaWFsKXsKLQkJc3BlY2lhbE51bWJlckdlbiA9IHNwZWNpYWw7Ci0JCXJldHVybiBjcmVhdGVBdHRyaWJ1dGUobmV3IEVBdHRyaWJ1dGVEZXNjcmlwdG9yKGF0dCxvYmouZUNsYXNzKCkpKTsKLQl9Ci0JCQkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3Qgb2JqLCAgYm9vbGVhbiBzcGVjaWFsLCBpbnQgdmVyLCBpbnQgbW9kVHlwZSkgewotCSAgIHNwZWNpYWxOdW1iZXJHZW4gPSBzcGVjaWFsOwotCSAgIHZlcnNpb24gPSB2ZXI7Ci0JICAgbW9kdWxlVHlwZSA9IG1vZFR5cGU7Ci0JICAgcmV0dXJuIGNyZWF0ZUF0dHJpYnV0ZShuZXcgRUF0dHJpYnV0ZURlc2NyaXB0b3IoYXR0LG9iai5lQ2xhc3MoKSkpOwotICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgY3JlYXRlQXR0cmlidXRlKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlFQ2xhc3NpZmllciBtZXRhID0gYXR0LmdldEZlYXR1cmUoKS5nZXRFVHlwZSgpOwotCQlpZiAobWV0YSBpbnN0YW5jZW9mIEVFbnVtICYmIGF0dC5nZXRGZWF0dXJlKCkuaXNNYW55KCkpewotCQkJTGlzdCBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY29sbGVjdGlvbi5hZGQoY3JlYXRlRW51bShhdHQpKTsKLQkJCXJldHVybiBjb2xsZWN0aW9uOwotCQl9Ci0JCWVsc2UgaWYgKG1ldGEgaW5zdGFuY2VvZiBFRW51bSkKLQkJCXJldHVybiBjcmVhdGVFbnVtKGF0dCk7Ci0JCWVsc2UgaWYgKCh2ZXJzaW9uID09IFZFUlNJT05fMV8zIHx8IHZlcnNpb24gPT0gVkVSU0lPTl8xXzIpICYmIGF0dC5nZXRGZWF0dXJlKCkuZXF1YWxzKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SFRUUE1ldGhvZFR5cGVfSHR0cE1ldGhvZCgpKSkKLQkJCXJldHVybiBjcmVhdGVTcGVjaWFsSHR0cE1ldGhvZHNGb3IxMygpOwotCQllbHNlIGlmICh2ZXJzaW9uID09IFZFUlNJT05fMV8zICYmIGF0dC5nZXRGZWF0dXJlKCkuZXF1YWxzKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVKQkxvY2FsUmVmX0xvY2FsKCkpKQotCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKG5ldyBFQXR0cmlidXRlRGVzY3JpcHRvcihDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfUmVtb3RlKCksIGF0dC5nZXRNZXRhQ2xhc3MoKSkpOwotCQllbHNlIGlmICh2ZXJzaW9uID09IFZFUlNJT05fMV8zICYmIGF0dC5nZXRGZWF0dXJlKCkuZXF1YWxzKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVKQkxvY2FsUmVmX0xvY2FsSG9tZSgpKSkKLQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhuZXcgRUF0dHJpYnV0ZURlc2NyaXB0b3IoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX0hvbWUoKSxhdHQuZ2V0TWV0YUNsYXNzKCkpKTsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJwYXJtcyIpKQotCQkJcmV0dXJuIGNyZWF0ZVBhcmFtcyhhdHQpOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJsb2NhdGlvbiIpICYmIHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpCi0JCQlyZXR1cm4gY3JlYXRlTG9jYXRpb24oYXR0KTsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuc3RhcnRzV2l0aCgibG9jYWxlIikgJiYgdmVyc2lvbiA9PSBWRVJTSU9OXzFfNCkKLQkJCXJldHVybiBjcmVhdGVMb2NhbGUoKTsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJsYW5nIikpCi0JCQlyZXR1cm4gY3JlYXRlTGFuZyhhdHQpOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoInZlcnNpb24iKSkKLQkJCWlmIChhdHQuZ2V0RmVhdHVyZSgpID09IEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfVmVyc2lvbigpKSAKLQkJCQlyZXR1cm4gIjIueCI7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGNyZWF0ZVZlcnNpb24oYXR0KTsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJtaW1lVHlwZSIpICYmIHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpCi0JCQlyZXR1cm4gInRleHQvcGxhaW4iOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoImVycm9yQ29kZSIpICYmIHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpCi0JCQlyZXR1cm4gIjQwNCI7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygiZm9ybUxvZ2luUGFnZSIpICYmIHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpCi0JCQlyZXR1cm4gIi90ZXN0Rm9ybUxvZ2luUGFnZSI7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygiZm9ybUVycm9yUGFnZSIpICYmIHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpCi0JCQlyZXR1cm4gIi90ZXN0Rm9ybUVycm9ycGFnZSI7Ci0JCWVsc2UgaWYoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJsaW5rIikgJiYgdmVyc2lvbiA9PSBWRVJTSU9OXzFfNCkKLQkJCXJldHVybiAicm9sZU5hbWVfMCI7Ci0JCWVsc2UgaWYoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJzcGVjVmVyc2lvbiIpICYmIHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpCi0JCQlyZXR1cm4gIjEuNSI7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuaXNNYW55KCkpCi0JCQlyZXR1cm4gY3JlYXRlQ29sbGVjdGlvbihhdHQpOwotCQllbHNlIGlmIChtZXRhLmdldEluc3RhbmNlQ2xhc3NOYW1lKCkuZXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIikpCi0JCQlyZXR1cm4gIGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKGF0dCk7Ci0JCWVsc2UgaWYgKG1ldGEuZ2V0SW5zdGFuY2VDbGFzc05hbWUoKS5lcXVhbHMoImJvb2xlYW4iKSkKLQkJCXJldHVybiAgZ2VuZXJhdGVSYW5kb21Cb29sZWFuKGF0dCk7Ci0JCWVsc2UgaWYgKG1ldGEuZ2V0SW5zdGFuY2VDbGFzc05hbWUoKS5lcXVhbHMoImphdmEudXRpbC5MaXN0IikpCi0JCQlyZXR1cm4gIGNyZWF0ZUNvbGxlY3Rpb24oYXR0KTsKLQkJZWxzZSBpZihtZXRhLmdldE5hbWUoKS5lcXVhbHMoIlFOYW1lIikpewotCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tUU5hbWUoYXR0KTsKLQkJfQotCQlzd2l0Y2ggKG1ldGEuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVTVFJJTkc6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKGF0dCk7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FQk9PTEVBTl9PQkpFQ1Q6Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FQk9PTEVBTjoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21Cb29sZWFuKGF0dCk7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FSU5URUdFUl9PQkpFQ1Q6Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FSU5UOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUludGVnZXIoYXR0KTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVGTE9BVF9PQkpFQ1Q6Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FRkxPQVQ6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tRmxvYXQoYXR0KTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVDSEFSQUNURVJfT0JKRUNUOgotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUNIQVI6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tQ2hhcihhdHQpOwotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUxPTkdfT0JKRUNUOgotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUxPTkc6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tTG9uZygpOwotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJZVEVfT0JKRUNUOgotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJZVEU6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tQnl0ZSgpOwotCQkJY2FzZSBFY29yZVBhY2thZ2UuRURPVUJMRV9PQkpFQ1Q6Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FRE9VQkxFOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbURvdWJsZSgpOwotCQkJY2FzZSBFY29yZVBhY2thZ2UuRVNIT1JUX09CSkVDVDoKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVTSE9SVDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21TaG9ydChhdHQpOwotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUpBVkFfT0JKRUNUOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbU9iamVjdChhdHQpOwotCQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQkvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGNyZWF0ZUxvY2FsZSgpIHsKLSAgICAgICAgcmV0dXJuICJlbl9VUyI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGF0dAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgY3JlYXRlTG9jYXRpb24oRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0gICAgICAgIFN0cmluZyB0ZW1wID0gZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcoYXR0KTsKLSAgICAgICAgcmV0dXJuICIvLiIgKyB0ZW1wOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRU9iamVjdCBjcmVhdGVKYXZhQ2xhc3NQcm94eShFU3RydWN0dXJhbEZlYXR1cmUgcmVmLCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGF2Q2xhc3MgPT0gbnVsbCkgewotCQkJYXZDbGFzcyA9IG5ldyBTdHJpbmdbXSB7ICJqYXZhLnV0aWwuSGFzaFRhYmxlIiwgImphdmEudXRpbC5MaXN0IiwgImphdmEuc3FsLkRhdGEiLCAiamF2YS5sYW5nLkludGVnZXIiLCAiamF2YS5sYW5nLlN0cmluZyIgfTsKLQkJfQotCQlFQXR0cmlidXRlRGVzY3JpcHRvciBmZWF0dXJlID0gbmV3IEVBdHRyaWJ1dGVEZXNjcmlwdG9yKHJlZixlT2JqZWN0LmVDbGFzcygpKTsKLQkJaWYgKCFhdHRJbmRleC5jb250YWluc0tleShmZWF0dXJlKSkKLQkJCWF0dEluZGV4LnB1dChmZWF0dXJlLCBuZXcgSW50ZWdlcigwKSk7Ci0JCWludCBjbGFzc0luZGV4ID0gKChJbnRlZ2VyKWF0dEluZGV4LmdldChmZWF0dXJlKSkuaW50VmFsdWUoKTsKLQkJU3RyaW5nIG5hbWUgPSBhdkNsYXNzW2NsYXNzSW5kZXhdOwotCQljbGFzc0luZGV4Kys7Ci0JCWlmIChjbGFzc0luZGV4ID09IDUpCi0JCQljbGFzc0luZGV4ID0gMDsKLQkJYXR0SW5kZXgucHV0KGZlYXR1cmUsbmV3IEludGVnZXIoY2xhc3NJbmRleCkpOwotCQlyZXR1cm4gSmF2YUNsYXNzSW1wbC5jcmVhdGVDbGFzc1JlZihuYW1lKTsKLQl9Ci0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGNyZWF0ZVNwZWNpYWxIdHRwTWV0aG9kc0ZvcjEzKCkgewotCQlpZiAoaHR0cEFycmF5ID09IG51bGwpCi0JCQlodHRwQXJyYXkgPSBuZXcgU3RyaW5nW10gewotCQkJCSJHRVQiLAotCQkJCSJQT1NUIiwKLQkJCQkiUFVUIiwKLQkJCQkiREVMRVRFIiwKLQkJCQkiSEVBRCIsCi0JCQkJIk9QVElPTlMiLAotCQkJCSJUUkFDRSIKLQkJCX07Ci0JCWlmIChodHRwQXJyYXlJbmRleCA+PSBodHRwQXJyYXkubGVuZ3RoKQotCQkJaHR0cEFycmF5SW5kZXggPSAwOwotCQlPYmplY3QgaG9sZGVyID0gaHR0cEFycmF5W2h0dHBBcnJheUluZGV4XTsgCQotCQlodHRwQXJyYXlJbmRleCsrOwotCQlyZXR1cm4gaG9sZGVyOwotCX0KLQotCS8qKgotICAgICAqIEBwYXJhbSBhdHQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY3JlYXRlVmVyc2lvbihFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJU3RyaW5nIHZlcnNpb25Ib2xkZXIgPSAiIjsKLQkJc3dpdGNoIChtb2R1bGVUeXBlKSB7Ci0JCWNhc2UgQVBQSUNBVElPTiA6Ci0JCQlpZih2ZXJzaW9uID09IFZFUlNJT05fMV8yKSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIxLjIiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV8zKXsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuMyI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMS40IjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiNS4wIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBBUFBfQ0xJRU5UIDoKLQkJCWlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzIpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuMiI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuMyI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuNCI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjUuMCI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgRUpCIDoKLQkJCWlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzIpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuMSI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjIuMCI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjIuMSI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjMuMCI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgQ09OTkVDVE9SIDoKLQkJCWlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzIpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuMCI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuMCI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsgCi0JCQkJdmVyc2lvbkhvbGRlciA9ICIxLjUiOwotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlIFdFQiA6Ci0JCQlpZih2ZXJzaW9uID09IFZFUlNJT05fMV8yKSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIyLjIiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV8zKSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIyLjMiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV80KSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIyLjQiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7IAotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMi41IjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHZlcnNpb25Ib2xkZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgY3JlYXRlUGFyYW1zKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlpZiAocGFyYW1Db3VudCA9PSAwKXsKLQkJCXBhcmFtQ291bnQrKzsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKHBhcmFtQ291bnQgPT0gMSl7Ci0JCQlwYXJhbUNvdW50Kys7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJU3RyaW5nIHIgPSAiIjsKLQkJZm9yIChpbnQgaSA9IDEgOyBpIDwgcGFyYW1Db3VudCA7aSsrKXsKLQkJCXIgKz0gZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcoYXR0KSArICIgIjsKLQkJfQotCQlwYXJhbUNvdW50Kys7Ci0JCWlmIChwYXJhbUNvdW50ID09IDUpCi0JCQlwYXJhbUNvdW50ID0gMDsKLQkJcmV0dXJuIHI7Ci0JCQotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgY3JlYXRlTGFuZyhFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJU3RyaW5nIG5hbWUgPSBsYW5nQXJyYXlbbGFuZ0NvdW50XTsKLQkJbGFuZ0NvdW50Kys7Ci0JCWlmIChsYW5nQ291bnQgPT0gNykKLQkJCWxhbmdDb3VudCA9IDA7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGNyZWF0ZUNvbGxlY3Rpb24oRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZChnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhhdHQpKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbU9iamVjdChFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkgICAgcmV0dXJuIGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKGF0dCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgY3JlYXRlRW51bShFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJRUVudW0gYW5FbnVtID0gKEVFbnVtKSBhdHQuZ2V0RmVhdHVyZSgpLmdldEVUeXBlKCk7Ci0JCWlmICghZW51bU1hcC5jb250YWluc0tleShhdHQpKXsKLQkJCWlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoImF1dGhNZXRob2QiKSkKLQkJCQllbnVtTWFwLnB1dChhdHQsbmV3IEludGVnZXIoMSkpOwotCQkJZWxzZSAKLQkJCQllbnVtTWFwLnB1dChhdHQsbmV3IEludGVnZXIoMCkpOwotCQl9Ci0JCWludCBwb3MgPSAoKEludGVnZXIpZW51bU1hcC5nZXQoYXR0KSkuaW50VmFsdWUoKTsKLQkJRUxpc3QgbGl0ZXJhbHMgPSBhbkVudW0uZ2V0RUxpdGVyYWxzKCk7Ci0JCWludCBzaXplID0gbGl0ZXJhbHMuc2l6ZSgpOwotCQlpZiAocG9zID09IHNpemUpCi0JCQlwb3MgPSAwOwotCQlPYmplY3QgaG9sZGVyID0gYW5FbnVtLmdldEVFbnVtTGl0ZXJhbChwb3MpLmdldEluc3RhbmNlKCk7Ci0JCXBvcysrOwotCQllbnVtTWFwLnB1dChhdHQsbmV3IEludGVnZXIocG9zKSk7Ci0JCXJldHVybiBob2xkZXI7Ci0JICAgIAotCX0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbUNsYXNzbmFtZShFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJcmV0dXJuICJjb20uZm9vLiIgKyBnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhhdHQpOwotCX0KLQotCS8vUkVWSVNJVAotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tU2hvcnQoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2hvcnQoU2hvcnQucGFyc2VTaG9ydChTdHJpbmcudmFsdWVPZihnZW5lcmF0ZU51bWJlcihhdHQpKSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tRG91YmxlKCkgewotICAgICAgICByZXR1cm4gbmV3IERvdWJsZShyYW5kb21HZW5lcmF0b3IubmV4dERvdWJsZSgpKTsKLSAgICB9Ci0JLy9SRVZJU0lUCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21CeXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IEJ5dGUoImJ5dGUiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbUxvbmcoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTG9uZyhyYW5kb21HZW5lcmF0b3IubmV4dExvbmcoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21DaGFyKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotICAgICAgICByZXR1cm4gbmV3IENoYXJhY3RlcihnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhhdHQpLmNoYXJBdCgwKSk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbUZsb2F0KEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotICAgICAgICByZXR1cm4gbmV3IEZsb2F0KHJhbmRvbUdlbmVyYXRvci5uZXh0RmxvYXQoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21JbnRlZ2VyKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotICAgIAlyZXR1cm4gbmV3IEludGVnZXIoZ2VuZXJhdGVOdW1iZXIoYXR0KSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBzdGF0aWMgY2hhciBbXSBpbnRUb0NoYXJNYXBwaW5nID0gbmV3IGNoYXIgW10geyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicgfTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNoYXIgW10gY2hhclRvSW50TWFwcGluZyA9IG5ldyBjaGFyIFtdIHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21RTmFtZShFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLSAgICAJY2hhciBbXSBjaGFyQXJyYXkgPSBJbnRlZ2VyLnRvU3RyaW5nKGdlbmVyYXRlTnVtYmVyKGF0dCkpLnRvQ2hhckFycmF5KCk7Ci0gICAgCWZvcihpbnQgaT0wO2k8Y2hhckFycmF5Lmxlbmd0aDtpKyspewotICAgIAkJZm9yKGludCBqPTA7ajxjaGFyVG9JbnRNYXBwaW5nLmxlbmd0aDsgaisrKXsKLSAgICAJCQlpZiAoY2hhckFycmF5W2ldID09IGNoYXJUb0ludE1hcHBpbmdbal0pewotICAgIAkJCQljaGFyQXJyYXlbaV0gPSBpbnRUb0NoYXJNYXBwaW5nW2pdOwotICAgIAkJCQlicmVhazsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJcmV0dXJuIG5ldyBTdHJpbmcoY2hhckFycmF5KTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21Cb29sZWFuKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlpZiAoIWJvb2xlYW5NYXAuY29udGFpbnNLZXkoYXR0KSl7Ci0JCQlib29sZWFuTWFwLnB1dChhdHQsbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQl9Ci0JCUJvb2xlYW4gaG9sZGVyID0gKEJvb2xlYW4pYm9vbGVhbk1hcC5nZXQoYXR0KTsKLQkJYm9vbGVhbk1hcC5wdXQoYXR0LCBuZXcgQm9vbGVhbighaG9sZGVyLmJvb2xlYW5WYWx1ZSgpKSk7Ci0JCXJldHVybiBob2xkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCXJldHVybiBhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKSArICJfIiArIGdlbmVyYXRlTnVtYmVyKGF0dCk7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdlbmVyYXRlTnVtYmVyKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlpZighc3BlY2lhbE51bWJlckdlbikKLQkJCXJldHVybiBjb3VudCArKzsKLQkJZWxzZXsKLQkJCWlmKCFhdHRJbmRleC5jb250YWluc0tleShhdHQpKQotCQkJCWF0dEluZGV4LnB1dChhdHQsIG5ldyBJbnRlZ2VyKDApKTsKLQkJCWludCBob2xkZXIgPSAoKEludGVnZXIpIGF0dEluZGV4LmdldChhdHQpKS5pbnRWYWx1ZSgpOwotCQkJYXR0SW5kZXgucHV0KGF0dCwgbmV3IEludGVnZXIoaG9sZGVyKzEpKTsKLQkJCXJldHVybiBob2xkZXI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKXsKLQkJY291bnQgPSAwOwotCQllbnVtTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJaHR0cEFycmF5SW5kZXggPSAwOwotCQlwYXJhbUNvdW50ID0gMDsKLQkJbGFuZ0NvdW50ID0gMDsgIAotCQlib29sZWFuTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJYXR0SW5kZXggPSBuZXcgSGFzaE1hcCgpOwotCQlzcGVjaWFsTnVtYmVyR2VuID0gZmFsc2U7Ci0JCVRlc3RVdGlsaXRpZXMucmVzZXQoKTsKLQkJSjJFRVZlcnNpb25DaGVjay5jdXJfVGFncyA9IG51bGw7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvSjJFRVZlcnNpb25DaGVjay5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0oyRUVWZXJzaW9uQ2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhMDg5ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvSjJFRVZlcnNpb25DaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE0LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgSjJFRVZlcnNpb25DaGVjayB7Ci0JcHVibGljIGludCB2ZXJzaW9uOwotCS8vc3RhdGljIHZlcnNpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzIgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8zID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfNCA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl81XzAgPSAzOwotCQotCS8vbW9kdWxlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUElDQVRJT04gPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUF9DTElFTlQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RPUiA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUpCID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUIgPSA0OwotCi0JcHVibGljIHN0YXRpYyBMaXN0IGN1cl9UYWdzOwotCXByaXZhdGUgc3RhdGljIENvbW1vblBhY2thZ2UgQ09NID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLSAgICBwdWJsaWMgSjJFRVZlcnNpb25DaGVjaygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQXR0cmlidXRlVmVyc2lvbihFQXR0cmlidXRlIGF0dCwgaW50IHZlcnNpb24sIGludCB0eXBlKXsKLQkJLy9UT0RPOiBBZGQgdmVyc2lvbiAxLjIgZXhjbHVkZXMKLQkJaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMyB8fCB2ZXJzaW9uID09IFZFUlNJT05fMV8yKXsKLQkJCWlmKGN1cl9UYWdzID09IG51bGwpewotCQkJCWN1cl9UYWdzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXBvcHVsYXRlXzFfM0xpc3QodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV80IHx8IHZlcnNpb24gPT0gVkVSU0lPTl81XzApewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmKGN1cl9UYWdzLmNvbnRhaW5zKGF0dCkgfHwgY3VyX1RhZ3MuY29udGFpbnMoYXR0LmdldEVUeXBlKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgCi0gICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1JlZmVyZW5jZVZlcnNpb24oRVN0cnVjdHVyYWxGZWF0dXJlIHJlZiwgaW50IHZlcnNpb24sIGludCB0eXBlKXsKLQkJLy9UT0RPOiBBZGQgdmVyc2lvbiAxLjIgZXhjbHVkZXMKLQkJaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMyB8fCB2ZXJzaW9uID09IFZFUlNJT05fMV8yKXsKLQkJCWlmKGN1cl9UYWdzID09IG51bGwpewotCQkJCWN1cl9UYWdzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXBvcHVsYXRlXzFfM0xpc3QodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV80IHx8IHZlcnNpb24gPT0gVkVSU0lPTl81XzApewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmKGN1cl9UYWdzLmNvbnRhaW5zKHJlZikgfHwgY3VyX1RhZ3MuY29udGFpbnMocmVmLmdldEVUeXBlKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgICAgCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzJMaXN0KGludCB0eXBlKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBBUFBJQ0FUSU9OIDoKLQkJCQlwb3B1bGF0ZV8xXzJBcHBsaWNhdGlvbigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBUFBfQ0xJRU5UIDoKLQkJCQlwb3B1bGF0ZV8xXzJBcHBDbGllbnQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRUpCIDoKLQkJCQlwb3B1bGF0ZV8xXzJFSkIoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09OTkVDVE9SIDoKLQkJCQlwb3B1bGF0ZV8xXzJFSkIoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0VCIDoKLQkJCQlwb3B1bGF0ZV8xXzJXZWIoKTsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8zTGlzdChpbnQgdHlwZSkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgQVBQSUNBVElPTiA6Ci0JCQkJcG9wdWxhdGVfMV8zQXBwbGljYXRpb24oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVBQX0NMSUVOVCA6Ci0JCQkJcG9wdWxhdGVfMV8zQXBwQ2xpZW50KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVKQiA6Ci0JCQkJcG9wdWxhdGVfMV8zRUpCKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTk5FQ1RPUiA6Ci0JCQkJcG9wdWxhdGVfMV8zRUpCKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdFQiA6Ci0JCQkJcG9wdWxhdGVfMV8zV2ViKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8yQXBwbGljYXRpb24oKXsKLQkJcG9wdWxhdGVfMV8zQXBwbGljYXRpb24oKTsKLSAgICB9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfMkFwcENsaWVudCgpewotCQlwb3B1bGF0ZV8xXzNBcHBDbGllbnQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzJFSkIoKXsKLQkJcG9wdWxhdGVfMV8zRUpCKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8yQ29ubmVjdG9yKCl7Ci0JCXBvcHVsYXRlXzFfM0Nvbm5lY3RvcigpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfMldlYigpewotCQlwb3B1bGF0ZV8xXzNXZWIoKTsKLQl9Ci0KLQkvLzEuMwotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8zQXBwbGljYXRpb24oKXsKLQkJQ29tbW9uUGFja2FnZSBDT00gPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRJY29uVHlwZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREaXNwbGF5TmFtZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREZXNjcmlwdGlvbigpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREZXNjcmlwdGlvbkdyb3VwKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb25zKCkpOwotCQljdXJfVGFncy5hZGQoQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCkpOwkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzNBcHBDbGllbnQoKXsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRJY29uVHlwZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREaXNwbGF5TmFtZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREZXNjcmlwdGlvbigpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREZXNjcmlwdGlvbkdyb3VwKCkpOwotCQljdXJfVGFncy5hZGQoQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpKTsKLQkJY3VyX1RhZ3MuYWRkKENsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCkpOwotCQljdXJfVGFncy5hZGQoQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKTsKLQkJY3VyX1RhZ3MuYWRkKENsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpKTsKLQkJLy9jdXJfVGFncy5hZGQoQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8zQ29ubmVjdG9yKCl7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0SWNvblR5cGUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJY3VyX1RhZ3MuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpOwotCQljdXJfVGFncy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpKTsKLQkJY3VyX1RhZ3MuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0KCkpOwotCQljdXJfVGFncy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1ZlcnNpb24oKSk7Ci0JfQotCQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8zRUpCKCkgewotCQljdXJfVGFncy5hZGQoQ09NLmdldEljb25UeXBlKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERpc3BsYXlOYW1lKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWN1cl9UYWdzLmFkZChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJKYXJfVmVyc2lvbigpKTsKLQkJY3VyX1RhZ3MuYWRkKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldFNlc3Npb25fU2VydmljZUVuZHBvaW50KCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldEpORElFbnZSZWZzR3JvdXBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRKTkRJRW52UmVmc0dyb3VwX1NlcnZpY2VSZWZzKCkpOwotCQljdXJfVGFncy5hZGQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdpbmdUeXBlKCkpOwotCQljdXJfVGFncy5hZGQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlRGVzdGluYXRpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuX0xpbmsoKSk7Ci0JCWN1cl9UYWdzLmFkZChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuX0FjdGl2YXRpb25Db25maWcoKSk7CQotICAgIH0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8zV2ViKCl7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0SWNvblR5cGUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJY3VyX1RhZ3MuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX1ZlcnNpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9Kc3BDb25maWcoKSk7Ci0JCWN1cl9UYWdzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25zKCkpOwotCQljdXJfVGFncy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL1Rlc3RVdGlsaXRpZXMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9UZXN0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNzc4ZWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL1Rlc3RVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgYWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyAgY2xhc3MgVGVzdFV0aWxpdGllcyBleHRlbmRzIEVjb3JlVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIG9iamVjdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIHN1YnNldE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkKLQkvKioKLQkJICogUmV0dXJucyB0aGUgZmlyc3QgY29sbGVjdGlvbiBtZW1iZXIgdGhhdCB7QGxpbmsgRUNsYXNzaWZpZXIjaXNJbnN0YW5jZSBpcyBhbiBpbnN0YW5jZX0gb2YgdGhlIHR5cGUuCi0JCSAqIEBwYXJhbSBvYmplY3RzIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRvIGNoZWNrLgotCQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBvYmplY3QgdG8gZmluZC4KLQkJICogQHJldHVybiB0aGUgZmlyc3Qgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE9iamVjdEJ5VHlwZShSZXNvdXJjZSByZXMsIEVDbGFzc2lmaWVyIHR5cGUsIGJvb2xlYW4gaXNNYW55KSB7Ci0JCQlpZiAoaXNNYW55KQotCQkJCXJldHVybiBnZXRDb250YWluZWRDb2xsZWN0aW9uQnlUeXBlKHJlcy5nZXRDb250ZW50cygpLCB0eXBlKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVkT2JqZWN0QnlUeXBlKHJlcy5nZXRDb250ZW50cygpLCB0eXBlKTsKLQkJfQotCi0JCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldENvbnRhaW5lZE9iamVjdEJ5VHlwZShMaXN0IGxpc3QsIEVDbGFzc2lmaWVyIHR5cGUpIHsKLQkJCU9iamVjdCBmb3VuZDsKLQkJCWZvdW5kID0gZ2V0T2JqZWN0c0J5VHlwZShsaXN0LCB0eXBlKTsKLQkJCWlmIChmb3VuZCAhPSBudWxsICYmICEoKENvbGxlY3Rpb24pZm91bmQpLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZXh0cmFjdE9iamVjdCgoTGlzdCkgZm91bmQsdHlwZSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkJCWZvdW5kID0gZ2V0Q29udGFpbmVkT2JqZWN0QnlUeXBlKG9iai5lQ29udGVudHMoKSwgdHlwZSk7Ci0JCQkJaWYgKGZvdW5kICE9IG51bGwpCi0JCQkJCXJldHVybiBmb3VuZDsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRDb250YWluZWRDb2xsZWN0aW9uQnlUeXBlKExpc3QgbGlzdCwgRUNsYXNzaWZpZXIgdHlwZSkgewotCQkJTGlzdCBmb3VuZDsKLQkJCWZvdW5kID0gKExpc3QpZ2V0T2JqZWN0c0J5VHlwZShsaXN0LCB0eXBlKTsKLQkJCWlmIChmb3VuZCAhPSBudWxsICYmICFmb3VuZC5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIGV4dHJhY3RTdWJzZXQoZm91bmQsIHR5cGUpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBsaXN0LmdldChpKTsKLQkJCQlmb3VuZCA9IChMaXN0KSBnZXRDb250YWluZWRDb2xsZWN0aW9uQnlUeXBlKG9iai5lQ29udGVudHMoKSwgdHlwZSk7Ci0JCQkJaWYgKGZvdW5kICE9IG51bGwpCi0JCQkJCXJldHVybiBmb3VuZDsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQkKLQkJCi0JCX0KLQkKLQkJcHVibGljIHN0YXRpYyBMaXN0IGV4dHJhY3RTdWJzZXQoTGlzdCBmb3VuZCwgRUNsYXNzaWZpZXIgdHlwZSkgewotCQkJaWYgKCFzdWJzZXRNYXAuY29udGFpbnNLZXkodHlwZSkpewotCQkJCXN1YnNldE1hcC5wdXQodHlwZSxuZXcgSW50ZWdlcigxKSk7Ci0JCQl9Ci0JCQlpbnQgcG9zID0gKChJbnRlZ2VyKXN1YnNldE1hcC5nZXQodHlwZSkpLmludFZhbHVlKCk7Ci0JCQotCQkJaWYgKHBvcyA9PSBmb3VuZC5zaXplKCkpCi0JCQkJcG9zID0gMTsKLQkJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3M7IGkrKykKLQkJCQlyZXN1bHQuYWRkKGZvdW5kLmdldChpKSk7Ci0JCQlwb3MrKzsKLQkJCXN1YnNldE1hcC5wdXQodHlwZSxuZXcgSW50ZWdlcihwb3MpKTsJCi0JCQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQotCQlwdWJsaWMgc3RhdGljIE9iamVjdCBleHRyYWN0T2JqZWN0KExpc3QgZm91bmQsIEVDbGFzc2lmaWVyIHR5cGUpIHsKLQkJCWlmICghb2JqZWN0TWFwLmNvbnRhaW5zS2V5KHR5cGUpKXsKLQkJCQlvYmplY3RNYXAucHV0KHR5cGUsbmV3IEludGVnZXIoMCkpOwotCQkJfQotCQkJaW50IHBvcyA9ICgoSW50ZWdlcilvYmplY3RNYXAuZ2V0KHR5cGUpKS5pbnRWYWx1ZSgpOwotCQkKLQkJCWlmIChwb3MgPT0gZm91bmQuc2l6ZSgpKQotCQkJCXBvcyA9IDA7Ci0JCQlPYmplY3QgaG9sZGVyID0gZm91bmQuZ2V0KHBvcyk7Ci0JCQlwb3MrKzsKLQkJCW9iamVjdE1hcC5wdXQodHlwZSxuZXcgSW50ZWdlcihwb3MpKTsJCi0JCQotCQkJcmV0dXJuIGhvbGRlcjsKLQkJfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCl7Ci0JCXN1YnNldE1hcC5jbGVhcigpOwotCQlvYmplY3RNYXAuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDA2ODlhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5BbGxUZXN0czsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZEJWVCBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlRGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAiY29tbW9uQXJjaGl2ZVJlc291cmNlcyIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cyIpOwotICAgICAgICAgICAgVVJMIHVybCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOyAKLSAgICAgICAgCUF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpLmdldEZpbGUoKSArICJjb21tb25BcmNoaXZlUmVzb3VyY2VzIisgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2luZyB3b3JraW5nIGRpcmVjdG9yeSBzaW5jZSBhIHdvcmtzcGFjZSBVUkwgY291bGQgbm90IGJlIGxvY2F0ZWQuIik7Ci0JCX0gCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgdW5pbXBsZW1lbnRlZE1ldGhvZHM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgICAgIGlmICh1bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgdW5pbXBsZW1lbnRlZE1ldGhvZHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEF1dG9tYXRlZEJWVCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgQXV0b21hdGVkQlZULnN1aXRlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VpdGUudGVzdENvdW50KCk7IGkrKykgewotICAgICAgICAgICAgYWRkVGVzdChzdWl0ZS50ZXN0QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmJ2dCIpOwotICAgICAgICAvLyRKVW5pdC1CRUdJTiQKLSAgICAgICAgLy9UT0RPOiBNYWtlIHRoZSBBcmNoaXZlIFRlc3QgV29yawotICAgICAgIC8vIHN1aXRlLmFkZFRlc3QoQWxsQXJjaGl2ZVRlc3RzSmF2YS5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChBbGxUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgLy9zdWl0ZS5hZGRUZXN0KEFsbEphdmFUZXN0c0phdmEuc3VpdGUoKSk7Ci0gICAgICAgIC8vJEpVbml0LUVORCQKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVEVjbGlwc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVEVjbGlwc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiMDA3ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkQlZURWNsaXBzZSBleHRlbmRzIEF1dG9tYXRlZEJWVCB7Ci0JCi0JcHVibGljIEF1dG9tYXRlZEJWVEVjbGlwc2UoKXsKLQkJc3VwZXIoKTsKLQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cyIpOwotICAgICAgICBVUkwgdXJsID0gcGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIAlBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAiY29tbW9uQXJjaGl2ZVJlc291cmNlcyIrIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZW1mbG9hZC9Mb2FkSmF4UlBDTWFwT3V0c2lkZVdvcmtzcGFjZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZW1mbG9hZC9Mb2FkSmF4UlBDTWFwT3V0c2lkZVdvcmtzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWVmNGZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VtZmxvYWQvTG9hZEpheFJQQ01hcE91dHNpZGVXb3Jrc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lbWZsb2FkOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJET01SZW5kZXJlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIExvYWRKYXhSUENNYXBPdXRzaWRlV29ya3NwYWNlIGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8vcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZURpcmVjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSAgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJ0ZXN0RGF0YSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJ3ZWJzZXJ2aWNlcyIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJNRVRBLUlORiIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLSAgIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogTG9hZCBhbGwgdGhlIGFyZ3VtZW50IGZpbGUgcGF0aHMgb3IgVVJJcyBhcyBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBhcmdzIHRoZSBmaWxlIHBhdGhzIG9yIFVSSXMuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMb2FkRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cyIpOwotICAgICAgICBVUkwgdXJsID0gcGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCk7IAotICAgICAgICBTdHJpbmcgYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAidGVzdERhdGEiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAid2Vic2VydmljZXMiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAiTUVUQS1JTkYiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JCQotCS8vIENhbGwgSjJFRSBJbml0KCk7Ci0JCQotCUoyRUVJbml0LmluaXQoKTsKLQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQgdG8gaG9sZCB0aGUgcmVzb3VyY2VzLgotCS8vCi0JUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCXJlc291cmNlU2V0LnNldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLQlVUklDb252ZXJ0ZXIgY29udiA9IG5ldyBVUklDb252ZXJ0ZXJJbXBsKCk7Ci0JcmVzb3VyY2VTZXQuc2V0VVJJQ29udmVydGVyKGNvbnYpOwotCUVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0Uuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCi0JCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoYmFzZURpcmVjdG9yeSArICJBbm51aXR5U2VydmljZXNfbWFwcGluZy54bWwiKTsKLQkJCXJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KHVyaS5sYXN0U2VnbWVudCgpLCBuZXcgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5KEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyBEZW1hbmQgbG9hZCByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLgotCQkJCS8vCi0JCQkJSmF4cnBjbWFwUmVzb3VyY2UgamF4cnBjbWFwUmVzID0gKEpheHJwY21hcFJlc291cmNlKXJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkZWQgIiArIHVyaSk7Ci0JCQkJamF4cnBjbWFwUmVzLmdldENvbnRlbnRzKCk7Ci0KLQkJCX0KLQkJCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSBsb2FkaW5nICIgKyB1cmkpOwotCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogUHJpbnRzIGRpYWdub3N0aWNzIHdpdGggaW5kZW50YXRpb24uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBwYXJhbSBkaWFnbm9zdGljIHRoZSBkaWFnbm9zdGljIHRvIHByaW50LgotICogQHBhcmFtIGluZGVudCB0aGUgaW5kZW50YXRpb24gZm9yIHByaW50aW5nLgotICogQGdlbmVyYXRlZAotICovCi1wcm90ZWN0ZWQgc3RhdGljIHZvaWQgcHJpbnREaWFnbm9zdGljKERpYWdub3N0aWMgZGlhZ25vc3RpYywgU3RyaW5nIGluZGVudCkgewotCVN5c3RlbS5vdXQucHJpbnQoaW5kZW50KTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oZGlhZ25vc3RpYy5nZXRNZXNzYWdlKCkpOwotCWZvciAoSXRlcmF0b3IgaSA9IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCXByaW50RGlhZ25vc3RpYygoRGlhZ25vc3RpYylpLm5leHQoKSwgaW5kZW50ICsgIiAgIik7Ci0JfQotfQotCX0KLQotCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VtZmxvYWQvTG9hZFdlYlNlcnZpY2VzT3V0c2lkZVdvcmtzcGFjZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZW1mbG9hZC9Mb2FkV2ViU2VydmljZXNPdXRzaWRlV29ya3NwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MThhNjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZW1mbG9hZC9Mb2FkV2ViU2VydmljZXNPdXRzaWRlV29ya3NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZW1mbG9hZDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkRpYWdub3N0aWNpYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OwotCi0KLXB1YmxpYyBjbGFzcyBMb2FkV2ViU2VydmljZXNPdXRzaWRlV29ya3NwYWNlIGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VEaXJlY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAidGVzdERhdGEiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAid2Vic2VydmljZXMiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAiTUVUQS1JTkYiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0gICAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIExvYWQgYWxsIHRoZSBhcmd1bWVudCBmaWxlIHBhdGhzIG9yIFVSSXMgYXMgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gYXJncyB0aGUgZmlsZSBwYXRocyBvciBVUklzLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TG9hZEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JLy8gQ2FsbCBKMkVFIEluaXQoKTsKLQkJCi0JSjJFRUluaXQuaW5pdCgpOwotCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldCB0byBob2xkIHRoZSByZXNvdXJjZXMuCi0JLy8KLQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQlyZXNvdXJjZVNldC5zZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShuZXcgSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkpOwotCVVSSUNvbnZlcnRlciBjb252ID0gbmV3IFVSSUNvbnZlcnRlckltcGwoKTsKLQlyZXNvdXJjZVNldC5zZXRVUklDb252ZXJ0ZXIoY29udik7Ci0JCi0JCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoYmFzZURpcmVjdG9yeSArICJ3ZWJzZXJ2aWNlcy54bWwiKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyBEZW1hbmQgbG9hZCByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLgotCQkJCS8vCi0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGVkICIgKyB1cmkpOwotCi0JCQkJLy8gVmFsaWRhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2FkZWQgcmVzb3VyY2UuCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGogPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApIHsKLQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3Qpai5uZXh0KCk7Ci0JCQkJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IERpYWdub3N0aWNpYW4uSU5TVEFOQ0UudmFsaWRhdGUoZU9iamVjdCk7Ci0JCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgewotCQkJCQkJcHJpbnREaWFnbm9zdGljKGRpYWdub3N0aWMsICIiKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSBsb2FkaW5nICIgKyB1cmkpOwotCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogUHJpbnRzIGRpYWdub3N0aWNzIHdpdGggaW5kZW50YXRpb24uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBwYXJhbSBkaWFnbm9zdGljIHRoZSBkaWFnbm9zdGljIHRvIHByaW50LgotICogQHBhcmFtIGluZGVudCB0aGUgaW5kZW50YXRpb24gZm9yIHByaW50aW5nLgotICogQGdlbmVyYXRlZAotICovCi1wcm90ZWN0ZWQgc3RhdGljIHZvaWQgcHJpbnREaWFnbm9zdGljKERpYWdub3N0aWMgZGlhZ25vc3RpYywgU3RyaW5nIGluZGVudCkgewotCVN5c3RlbS5vdXQucHJpbnQoaW5kZW50KTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oZGlhZ25vc3RpYy5nZXRNZXNzYWdlKCkpOwotCWZvciAoSXRlcmF0b3IgaSA9IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCXByaW50RGlhZ25vc3RpYygoRGlhZ25vc3RpYylpLm5leHQoKSwgaW5kZW50ICsgIiAgIik7Ci0JfQotfQotCX0KLQotCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3Rlc3QvQXBwbGljYXRpb25GYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vdGVzdC9BcHBsaWNhdGlvbkZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYmE4NmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vdGVzdC9BcHBsaWNhdGlvbkZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLnRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkNvbm5lY3Rvck1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5FamJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uSmF2YUNsaWVudE1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25GYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCSBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQXBwbGljYXRpb25GYWN0b3J5VGVzdC5jbGFzcyk7Ci0gICAgfQotCSAgCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUFwcGxpY2F0aW9uKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBcHBsaWNhdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTW9kdWxlKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVNb2R1bGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXZWJNb2R1bGUoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25GYWN0b3J5IG9iakFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdlYk1vZHVsZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVdlYk1vZHVsZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUphdmFDbGllbnRNb2R1bGUoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25GYWN0b3J5IG9iakFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEphdmFDbGllbnRNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVKYXZhQ2xpZW50TW9kdWxlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRWpiTW9kdWxlKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFamJNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVFamJNb2R1bGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb25uZWN0b3JNb2R1bGUoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25GYWN0b3J5IG9iakFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENvbm5lY3Rvck1vZHVsZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3Rlc3QvQXBwbGljYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi90ZXN0L0FwcGxpY2F0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjI4Y2I1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3Rlc3QvQXBwbGljYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLnRlc3Q7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVhckVNRlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblRlc3QgZXh0ZW5kcyBFYXJFTUZUZXN0IHsKLQotCSBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21tb25GYWN0b3J5IENPTU1PTkZBQ1RPUlkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0JIHB1YmxpYyBBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLSAgICAvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0gICAgICAgIGNyZWF0ZUVBUigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNTZWN1cml0eVJvbGUoKSB7Ci0JCQotICAgICAgICBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSJyb2xlMSIgOwotICAgICAgICBTdHJpbmcgbmFtZTIgPSJyb2xlMiIgOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uY29udGFpbnNTZWN1cml0eVJvbGUobmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgZmFsc2UpIDsKLSAgICAgICAgU2VjdXJpdHlSb2xlIHJvbGUgPSBDT01NT05GQUNUT1JZLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCQlyb2xlLnNldFJvbGVOYW1lKG5hbWUpOwotICAgICAgICBvYmpBcHBsaWNhdGlvbi5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKHJvbGUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmNvbnRhaW5zU2VjdXJpdHlSb2xlKG5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIHRydWUpIDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5jb250YWluc1NlY3VyaXR5Um9sZShuYW1lMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgZmFsc2UpIDsKLSAgICAgICAKLSAgICB9Ci0KLSAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRNb2R1bGUoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyB1cmkgPSAiIjsKLSAgICAgICAgTW9kdWxlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGUodXJpKTsKLSAgICB9Ki8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9kdWxlXzIoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIE1vZHVsZSBtb2R1bGUgPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZU1vZHVsZSgpOwotICAgICAgICBTdHJpbmcgdXJpID0gInVyaTEiOwotICAgICAgICBTdHJpbmcgYWx0REQgPSAiYWx0REQxIjsKLSAgICAgICAgbW9kdWxlLnNldFVyaSh1cmkpOwotICAgICAgICBtb2R1bGUuc2V0QWx0REQoYWx0REQpOwotICAgICAgICBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGVzKCkuYWRkKG1vZHVsZSk7Ci0gICAgICAgIE1vZHVsZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uZ2V0TW9kdWxlKHVyaSwgYWx0REQpOwotICAgICAgICBhc3NlcnRFcXVhbHMobW9kdWxlLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEZpcnN0TW9kdWxlKCkgewotCi0gICAgCSBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgIE1vZHVsZSBtb2R1bGUgPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZU1vZHVsZSgpOwotICAgICAgICAgTW9kdWxlIG1vZHVsZTIgPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZU1vZHVsZSgpOwotICAgICAgICAgTW9kdWxlIG1vZHVsZTMgPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZU1vZHVsZSgpOwotICAgICAgICAgU3RyaW5nIHVyaSA9ICJ1cmkxIjsKLSAgICAgICAgIFN0cmluZyB1cmkyID0gInVyaTIiIDsKLSAgICAgICAgIFN0cmluZyBhbHRERCA9ICJhbHRERDEiOwotICAgICAgICAgU3RyaW5nIGFsdEREMiA9ICJhbHRERDIiIDsKLSAgICAgICAgIAotICAgICAgICAgbW9kdWxlLnNldFVyaSh1cmkpOwotICAgICAgICAgbW9kdWxlLnNldEFsdEREKGFsdEREKTsKLSAgICAgICAgIAotICAgICAgICAgbW9kdWxlMi5zZXRVcmkodXJpMik7Ci0gICAgICAgICBtb2R1bGUyLnNldEFsdEREKGFsdEREMik7Ci0gICAgICAgICAKLSAgICAgICAgIG1vZHVsZTMuc2V0VXJpKHVyaTIpOwotICAgICAgICAgbW9kdWxlMy5zZXRBbHRERChhbHRERCk7Ci0gICAgICAgICAKLSAgICAgICAgIG9iakFwcGxpY2F0aW9uLmdldE1vZHVsZXMoKS5hZGQobW9kdWxlKTsKLSAgICAgICAgIG9iakFwcGxpY2F0aW9uLmdldE1vZHVsZXMoKS5hZGQobW9kdWxlMik7Ci0gICAgICAgICBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGVzKCkuYWRkKG1vZHVsZTMpOwotICAgICAgICAgTW9kdWxlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uZ2V0Rmlyc3RNb2R1bGUodXJpMik7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMobW9kdWxlMixyZXRWYWx1ZSk7Ci0gICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1vZHVsZUhhdmluZ0FsdEREKCkgewotCi0gICAgCSBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgIE1vZHVsZSBtb2R1bGUgPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZU1vZHVsZSgpOwotICAgICAgICAgU3RyaW5nIHVyaSA9ICJ1cmkxIjsKLSAgICAgICAgIFN0cmluZyBhbHRERCA9ICJhbHRERDEiOwotICAgICAgICAgbW9kdWxlLnNldFVyaSh1cmkpOwotICAgICAgICAgbW9kdWxlLnNldEFsdEREKGFsdEREKTsKLSAgICAgICAgIG9iakFwcGxpY2F0aW9uLmdldE1vZHVsZXMoKS5hZGQobW9kdWxlKTsKLSAgICAgICAgIE1vZHVsZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldE1vZHVsZUhhdmluZ0FsdEREKGFsdEREKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhtb2R1bGUscmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VjdXJpdHlSb2xlTmFtZWQoKSB7Ci0KLSAgICAJIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICAgU3RyaW5nIG5hbWUgPSJyb2xlMSIgOwotICAgICAgICAgU3RyaW5nIG5hbWUyID0icm9sZTIiIDsKLSAgICAgICAgIFNlY3VyaXR5Um9sZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldFNlY3VyaXR5Um9sZU5hbWVkKG5hbWUpOwotICAgICAgICAgYXNzZXJ0TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgICBTZWN1cml0eVJvbGUgcm9sZSA9IENPTU1PTkZBQ1RPUlkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0gCQkgcm9sZS5zZXRSb2xlTmFtZShuYW1lKTsKLSAgICAgICAgIG9iakFwcGxpY2F0aW9uLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQocm9sZSk7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldFNlY3VyaXR5Um9sZU5hbWVkKG5hbWUpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCByb2xlKSA7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldFNlY3VyaXR5Um9sZU5hbWVkKG5hbWUyKTsKLSAgICAgICAgIGFzc2VydE51bGwocmV0VmFsdWUpOwotICAgICAgICAKLSAgICB9Ci0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfaXNWZXJzaW9uMV8yRGVzY3JpcHRvcigpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmlzVmVyc2lvbjFfMkRlc2NyaXB0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzVmVyc2lvbjFfM0Rlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5pc1ZlcnNpb24xXzNEZXNjcmlwdG9yKCk7Ci0gICAgfSovCi0KLSAvKiAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbigpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uZ2V0VmVyc2lvbigpOwotICAgIH0qLwotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRWZXJzaW9uSUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW5pdCgpOwotICAgIAlBcHBsaWNhdGlvblJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uUmVzb3VyY2UpIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShBUFBMSUNBVElPTik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBpbnQgcmV0VmFsdWUgPSAwOwotICAgICAgICByZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uKCkuZ2V0VmVyc2lvbklEKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlyZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uKCkuZ2V0VmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMyk7Ci0JICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzIpOwotCQlyZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uKCkuZ2V0VmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMik7ICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQotICAgIAlpbml0KCk7Ci0gICAgIAlBcHBsaWNhdGlvblJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uUmVzb3VyY2UpIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotIAkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0gCQlzZXRNb2R1bGVUeXBlKEFQUExJQ0FUSU9OKTsKLSAJCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBpbnQgcmV0VmFsdWUgPSAwOwotICAgICAgICByZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzQpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotIAkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0gCQlyZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotIAkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zKTsKLSAJICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0gCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8yKTsKLSAJCXJldFZhbHVlID0gREQuZ2V0QXBwbGljYXRpb24oKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0gCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzIpOyAgCi0gCSAgICAKLSAgICAgICAgCi0gICAgfQotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X3NldFZlcnNpb24oKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBuZXdWZXJzaW9uID0gIiI7Ci0gICAgICAgIG9iakFwcGxpY2F0aW9uLnNldFZlcnNpb24obmV3VmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZWN1cml0eVJvbGVzKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uZ2V0U2VjdXJpdHlSb2xlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9kdWxlcygpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldE1vZHVsZXMoKTsKLSAgICB9Ki8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uVGVzdCgidGVzdF9nZXRWZXJzaW9uSUQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uVGVzdCgidGVzdF9nZXRKMkVFVmVyc2lvbklEIikpOwotCQkKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25UZXN0KCJ0ZXN0X2dldFNlY3VyaXR5Um9sZU5hbWVkIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvblRlc3QoInRlc3RfZ2V0TW9kdWxlSGF2aW5nQWx0REQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uVGVzdCgidGVzdF9jb250YWluc1NlY3VyaXR5Um9sZSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25UZXN0KCJ0ZXN0X2dldE1vZHVsZV8yIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvblRlc3QoInRlc3RfZ2V0Rmlyc3RNb2R1bGUiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC90ZXN0L0FwcGxpY2F0aW9uQ2xpZW50VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L3Rlc3QvQXBwbGljYXRpb25DbGllbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZTM0MTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L3Rlc3QvQXBwbGljYXRpb25DbGllbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQudGVzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuQXBwQ2xpZW50RU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRUZXN0IGV4dGVuZHMgQXBwQ2xpZW50RU1GVGVzdCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCQotCX0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotICAgICAgICBjcmVhdGVFQVIoKTsKLSAgICAgICAgY3JlYXRlQXBwQ2xpZW50KCk7Ci0JfQotCXByaXZhdGUgQXBwbGljYXRpb25DbGllbnQgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGllbnRGYWN0b3J5KCkuY3JlYXRlQXBwbGljYXRpb25DbGllbnQoKTsKLQl9Ci0gIAotICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uQ2xpZW50VGVzdCgidGVzdF9nZXRWZXJzaW9uSUQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uQ2xpZW50VGVzdCgidGVzdF9nZXRKMkVFVmVyc2lvbklEIikpOwotCQkKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25DbGllbnRUZXN0KCJ0ZXN0X2dldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25DbGllbnRUZXN0KCJ0ZXN0X3NldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoKSB7Ci0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIGNhbGxCYWNrSGFuZGxlck5hbWUgPSAiVGVzdENhbGxCYWNrSGFuZGxlck5hbWUiIDsKLSAgICAgICAgb2JqQXBwbGljYXRpb25DbGllbnQuc2V0Q2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lKGNhbGxCYWNrSGFuZGxlck5hbWUpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0Q2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsQmFja0hhbmRsZXJOYW1lLCByZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoKSB7Ci0KLSAgICAJQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgY2FsbEJhY2tIYW5kbGVyTmFtZSA9ICJUZXN0Q2FsbEJhY2tIYW5kbGVyTmFtZSIgOwotICAgICAgICBvYmpBcHBsaWNhdGlvbkNsaWVudC5zZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoY2FsbEJhY2tIYW5kbGVyTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxCYWNrSGFuZGxlck5hbWUsIHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb25JRCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlpbml0KCk7Ci0gICAgCUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UgREQgPSAoQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSkgYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKEFQUF9DTElFTlQpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgaW50IHJldFZhbHVlID0gMDsKLSAgICAgICAgcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLmdldFZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzQpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLmdldFZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzMpOwotCSAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8yKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLmdldFZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzIpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaW5pdCgpOwotICAgIAlBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UpIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShBUFBfQ0xJRU5UKTsKLQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0gICAgICAgIGludCByZXRWYWx1ZSA9IDA7Ci0gICAgICAgIHJldFZhbHVlID0gREQuZ2V0QXBwbGljYXRpb25DbGllbnQoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlyZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uQ2xpZW50KCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzMpOwotCSAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8yKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLmdldEoyRUVWZXJzaW9uSUQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yKTsKLSAgICB9Ci0KLSAvKiAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbigpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldFZlcnNpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFZlcnNpb24oKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3VmVyc2lvbiA9ICIiOwotICAgICAgICBvYmpBcHBsaWNhdGlvbkNsaWVudC5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOwotICAgIH0qLwotCi0gICAgLypwdWJsaWMgdm9pZCB0ZXN0X2dldFJlc291cmNlUmVmcygpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRSZXNvdXJjZVJlZnMoKTsKLSAgICB9Ci0qLwotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRFbnZpcm9ubWVudFByb3BzKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldEVudmlyb25tZW50UHJvcHMoKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRFamJSZWZlcmVuY2VzKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldEVqYlJlZmVyZW5jZXMoKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRSZXNvdXJjZUVudlJlZnMoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FsbGJhY2tIYW5kbGVyKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmF2YUNsYXNzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRDYWxsYmFja0hhbmRsZXIoKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9zZXRDYWxsYmFja0hhbmRsZXIoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xhc3MgbmV3Q2FsbGJhY2tIYW5kbGVyID0gbnVsbDsKLSAgICAgICAgb2JqQXBwbGljYXRpb25DbGllbnQuc2V0Q2FsbGJhY2tIYW5kbGVyKG5ld0NhbGxiYWNrSGFuZGxlcik7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VydmljZVJlZnMoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0U2VydmljZVJlZnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0gICAgfSovCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC90ZXN0L0NsaWVudEZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvdGVzdC9DbGllbnRGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjU0MWQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC90ZXN0L0NsaWVudEZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgQ2xpZW50RmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIENsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldENsaWVudEZhY3RvcnkoKTsKLQl9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9DbGllbnRGYWN0b3J5KCkgewotICAgICAgICBDbGllbnRGYWN0b3J5IHRtcENsaWVudEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcENsaWVudEZhY3RvcnkpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpIHsKLQotICAgICAgICBDbGllbnRGYWN0b3J5IG9iakNsaWVudEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ2xpZW50RmFjdG9yeS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDbGllbnRGYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9Db21tb25GYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvQ29tbW9uRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyODY5Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9Db21tb25GYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLklkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Vc2VDYWxsZXJJZGVudGl0eTsKLQotcHVibGljIGNsYXNzIENvbW1vbkZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBDb21tb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbW1vbkZhY3RvcnkoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSB0bXBDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgCi0gICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVqYlJlZigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVqYlJlZiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVFamJSZWYoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFbnZFbnRyeSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVudkVudHJ5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZUVudkVudHJ5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUmVzb3VyY2VSZWYoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBSZXNvdXJjZVJlZiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVSZXNvdXJjZVJlZigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlY3VyaXR5Um9sZVJlZigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlY3VyaXR5Um9sZVJlZiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVTZWN1cml0eVJvbGVSZWYoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZWN1cml0eVJvbGUoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBTZWN1cml0eVJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUmVzb3VyY2VFbnZSZWYoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBSZXNvdXJjZUVudlJlZiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVSZXNvdXJjZUVudlJlZigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVKQkxvY2FsUmVmKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCTG9jYWxSZWYgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlRUpCTG9jYWxSZWYoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUnVuQXNTcGVjaWZpZWRJZGVudGl0eSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSWRlbnRpdHkoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBJZGVudGl0eSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVJZGVudGl0eSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUljb25UeXBlKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSWNvblR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlSWNvblR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVEaXNwbGF5TmFtZSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIERpc3BsYXlOYW1lIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWVzc2FnZURlc3RpbmF0aW9uUmVmIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1lc3NhZ2VEZXN0aW5hdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVQYXJhbVZhbHVlKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUGFyYW1WYWx1ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRGVzY3JpcHRpb25Hcm91cCgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIERlc2NyaXB0aW9uR3JvdXAgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlRGVzY3JpcHRpb25Hcm91cCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlY3VyaXR5SWRlbnRpdHkoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBTZWN1cml0eUlkZW50aXR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZVNlY3VyaXR5SWRlbnRpdHkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIFVzZUNhbGxlcklkZW50aXR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZVVzZUNhbGxlcklkZW50aXR5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBEZXNjcmlwdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVFOYW1lKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUU5hbWUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlUU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVMaXN0ZW5lcigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3RlbmVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZUxpc3RlbmVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0gCi0gICAgCi0gICAgLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ29tbW9uRmFjdG9yeVRlc3QuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDc2ZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCk7Ci0JfQotCQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRTbWFsbEljb24oKSB7Ci0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuZ2V0U21hbGxJY29uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRTbWFsbEljb24oKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld1NtYWxsSWNvbiA9ICIiOwotICAgICAgICBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5zZXRTbWFsbEljb24obmV3U21hbGxJY29uKTsKLSAgICB9ICovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U21hbGxJY29uR2VuKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdTbWFsbEljb24gPSAiIjsKLSAgICAgICAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuc2V0U21hbGxJY29uR2VuKG5ld1NtYWxsSWNvbik7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TGFyZ2VJY29uKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmdldExhcmdlSWNvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGFyZ2VJY29uKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMYXJnZUljb24gPSAiIjsKLSAgICAgICAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuc2V0TGFyZ2VJY29uKG5ld0xhcmdlSWNvbik7Ci0gICAgfSAqLwotCi0gICAvKnB1YmxpYyB2b2lkIHRlc3Rfc2V0TGFyZ2VJY29uR2VuKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMYXJnZUljb24gPSAiIjsKLSAgICAgICAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuc2V0TGFyZ2VJY29uR2VuKG5ld0xhcmdlSWNvbik7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfQotKi8KLSAgIAotICAgLyogcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbkdlbigpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuc2V0RGVzY3JpcHRpb25HZW4obmV3RGVzY3JpcHRpb24pOwotICAgIH0qLwotCi0gICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXREaXNwbGF5TmFtZSgpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5nZXREaXNwbGF5TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGlzcGxheU5hbWUoKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rpc3BsYXlOYW1lID0gIiI7Ci0gICAgICAgIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKLSAgICB9Ki8KLQotICAgLypwdWJsaWMgdm9pZCB0ZXN0X3NldERpc3BsYXlOYW1lR2VuKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEaXNwbGF5TmFtZSA9ICIiOwotICAgICAgICBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5zZXREaXNwbGF5TmFtZUdlbihuZXdEaXNwbGF5TmFtZSk7Ci0gICAgfSovCi0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvRWpiUmVmVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvRWpiUmVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTEwYWRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0VqYlJlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgRWpiUmVmVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVqYkZhY3RvcnkgRUpCRkFDVE9SWSA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21tb25GYWN0b3J5IENPTU1PTkZBQ1RPUlkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0JCi0JcHJpdmF0ZSBFamJSZWYgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBDT01NT05GQUNUT1JZLmNyZWF0ZUVqYlJlZigpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0VqYlJlZigpIHsKLSAgICAgICAgRWpiUmVmIHRtcEVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wRWpiUmVmKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExpbmtlZEVqYigpIHsKLSAgICAJCi0gICAgCUVKQkphciBvYmpFSkJKYXIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQkphcigpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEVKQkZBQ1RPUlkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAKLSAgICAJRWpiUmVmIGVqYlJlZiA9IENPTU1PTkZBQ1RPUlkuY3JlYXRlRWpiUmVmKCk7Ci0gICAgCVNlc3Npb24gc2Vzc2lvbjEgPSBFSkJGQUNUT1JZLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAJU3RyaW5nIG5hbWUxID0gIk5hbWUxIjsKLSAgICAJc2Vzc2lvbjEuc2V0TmFtZShuYW1lMSk7Ci0gICAgCQotICAgIAlTZXNzaW9uIHNlc3Npb24yID0gRUpCRkFDVE9SWS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMiA9ICJOYW1lMiI7Ci0gICAgCXNlc3Npb24yLnNldE5hbWUobmFtZTIpOwotICAgIAkKLSAgICAJZWpiUmVmLnNldExpbmsobmFtZTIpOwotICAgIAllamJSZWYuc2V0TmFtZSgiRWpiUmVmXyIgKyBuYW1lMik7Ci0gICAgCQotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24xKTsKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMik7Ci0gICAgICAgIEVudGVycHJpc2VCZWFuIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBlamJSZWYuZ2V0TGlua2VkRWpiKG9iakVKQkphcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXNzaW9uMixyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0VxdWl2YWxlbnQoKSB7Ci0KLSAgICAJRUpCSmFyIG9iakVKQkphciA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCSmFyKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gRUpCRkFDVE9SWS5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICAgICAgb2JqRUpCSmFyLnNldEFzc2VtYmx5RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgIAotICAgIAlFamJSZWYgZWpiUmVmMSA9IENPTU1PTkZBQ1RPUlkuY3JlYXRlRWpiUmVmKCk7Ci0gICAgCUVqYlJlZiBlamJSZWYyID0gQ09NTU9ORkFDVE9SWS5jcmVhdGVFamJSZWYoKTsKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMSA9IEVKQkZBQ1RPUlkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAJCi0gICAgCVNlc3Npb24gc2Vzc2lvbjIgPSBFSkJGQUNUT1JZLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAJU3RyaW5nIG5hbWUyID0gIk5hbWUyIjsKLSAgICAJc2Vzc2lvbjIuc2V0TmFtZShuYW1lMik7Ci0gICAgCQotICAgIAllamJSZWYxLnNldExpbmsobmFtZTIpOwotICAgIAllamJSZWYxLnNldE5hbWUoIkVqYlJlZl8iICsgbmFtZTIpOwotICAgIAkKLSAgICAJZWpiUmVmMi5zZXRMaW5rKG5hbWUyKTsKLSAgICAJZWpiUmVmMi5zZXROYW1lKCJFamJSZWZfIiArIG5hbWUyKTsKLSAgICAJCi0gICAgCVN0cmluZyBob21lMSA9ICJob21lMSI7Ci0gICAgCVN0cmluZyBob21lMiA9ICJob21lMiIgOwotICAgIAlTdHJpbmcgcmVtb3RlMSA9ICJyZW1vdGUxIiA7Ci0gICAgCVN0cmluZyByZW1vdGUyID0gInJlbW90ZTIiOwotICAgIAkKLSAgICAJZWpiUmVmMS5zZXRIb21lKGhvbWUxKTsKLSAgICAJZWpiUmVmMi5zZXRIb21lKGhvbWUxKTsKLSAgICAJCi0gICAgCWVqYlJlZjEuc2V0UmVtb3RlKHJlbW90ZTEpOwotICAgIAllamJSZWYyLnNldFJlbW90ZShyZW1vdGUxKTsKLSAgICAJCi0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjEpOwotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24yKTsKLSAgICAJCi0gICAgCWJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBlamJSZWYxLmlzRXF1aXZhbGVudChlamJSZWYyKTsJCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIGVqYlJlZjIuc2V0UmVtb3RlKHJlbW90ZTIpOwotICAgICAgICByZXRWYWx1ZSA9IGVqYlJlZjEuaXNFcXVpdmFsZW50KGVqYlJlZjIpOwkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGVqYlJlZjIuc2V0UmVtb3RlKHJlbW90ZTEpOwotICAgICAgICBlamJSZWYyLnNldEhvbWUoaG9tZTIpOwotICAgICAgICByZXRWYWx1ZSA9IGVqYlJlZjEuaXNFcXVpdmFsZW50KGVqYlJlZjIpOwkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGVqYlJlZjIuc2V0SG9tZShob21lMSk7Ci0gICAgICAgIGVqYlJlZjIuc2V0TGluayhuYW1lMSk7Ci0gICAgICAgIHJldFZhbHVlID0gZWpiUmVmMS5pc0VxdWl2YWxlbnQoZWpiUmVmMik7CQotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgZWpiUmVmMi5zZXRMaW5rKG5hbWUyKTsKLSAgICAgICAgZWpiUmVmMi5zZXROYW1lKCJFamJSZWZfIiArIG5hbWUxKTsKLSAgICAgICAgcmV0VmFsdWUgPSBlamJSZWYxLmlzRXF1aXZhbGVudChlamJSZWYyKTsJCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNMaW5rZWQoKSB7Ci0KLSAgICAJU2Vzc2lvbiBzZXNzaW9uMSA9IEVKQkZBQ1RPUlkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuaXNMaW5rZWQoc2Vzc2lvbjEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG9iakVqYlJlZi5zZXRMaW5rKG5hbWUxKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuaXNMaW5rZWQoc2Vzc2lvbjEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIHRydWUpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0xvY2FsKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmlzTG9jYWwoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgRUpCTG9jYWxSZWYgb2JqTG9jYWxSZWYgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlRUpCTG9jYWxSZWYoKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpMb2NhbFJlZi5pc0xvY2FsKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE5hbWUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdOYW1lID0gIiI7Ci0gICAgICAgIG9iakVqYlJlZi5zZXROYW1lKG5ld05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VHlwZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRWpiUmVmVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmdldFR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFR5cGUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVqYlJlZlR5cGUgbmV3VHlwZSA9IG51bGw7Ci0gICAgICAgIG9iakVqYlJlZi5zZXRUeXBlKG5ld1R5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5zZXRUeXBlKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpFamJSZWYudW5zZXRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1NldFR5cGUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuaXNTZXRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRIb21lKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuZ2V0SG9tZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SG9tZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0hvbWUgPSAiIjsKLSAgICAgICAgb2JqRWpiUmVmLnNldEhvbWUobmV3SG9tZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRSZW1vdGUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYlJlZi5nZXRSZW1vdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJlbW90ZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld1JlbW90ZSA9ICIiOwotICAgICAgICBvYmpFamJSZWYuc2V0UmVtb3RlKG5ld1JlbW90ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRMaW5rKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuZ2V0TGluaygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGluaygpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmsgPSAiIjsKLSAgICAgICAgb2JqRWpiUmVmLnNldExpbmsobmV3TGluayk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rlc2NyaXB0aW9uID0gIiI7Ci0gICAgICAgIG9iakVqYlJlZi5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbnMoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuZ2V0RGVzY3JpcHRpb25zKCk7Ci0gICAgfSovCi0gICAgCi0gICAgLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRWpiUmVmVGVzdC5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvTGlzdGVuZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9MaXN0ZW5lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwODVlYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9MaXN0ZW5lclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIExpc3RlbmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgTGlzdGVuZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaXN0ZW5lcigpOwotCX0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TGlzdGVuZXJDbGFzcygpIHsKLSAgICAgICAgTGlzdGVuZXIgb2JqTGlzdGVuZXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakxpc3RlbmVyLmdldExpc3RlbmVyQ2xhc3MoKTsKLSAgICB9IAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRMaXN0ZW5lckNsYXNzKCkgewotCi0gICAgICAgIExpc3RlbmVyIG9iakxpc3RlbmVyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmF2YUNsYXNzIG5ld0xpc3RlbmVyQ2xhc3MgPSBudWxsOwotICAgICAgICBvYmpMaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzKG5ld0xpc3RlbmVyQ2xhc3MpOwotICAgIH0qLwotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExpc3RlbmVyQ2xhc3NOYW1lKCkgewotCi0gICAgICAgIExpc3RlbmVyIG9iakxpc3RlbmVyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIGxpc3RlbmVyQ2xhc3NOYW1lID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjEiIDsKLSAgICAgICAgb2JqTGlzdGVuZXIuc2V0TGlzdGVuZXJDbGFzc05hbWUobGlzdGVuZXJDbGFzc05hbWUpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpMaXN0ZW5lci5nZXRMaXN0ZW5lckNsYXNzTmFtZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdGVuZXJDbGFzc05hbWUsIHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldExpc3RlbmVyQ2xhc3NOYW1lKCkgewotCi0gICAgICAgIExpc3RlbmVyIG9iakxpc3RlbmVyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIGxpc3RlbmVyQ2xhc3NOYW1lID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjEiOwotICAgICAgICBvYmpMaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzTmFtZShsaXN0ZW5lckNsYXNzTmFtZSk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakxpc3RlbmVyLmdldExpc3RlbmVyQ2xhc3NOYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0ZW5lckNsYXNzTmFtZSwgcmV0VmFsdWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShMaXN0ZW5lclRlc3QuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvUU5hbWVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9RTmFtZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1YmY4MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9RTmFtZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLQotcHVibGljIGNsYXNzIFFOYW1lVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIFFOYW1lIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUU5hbWUoKTsKLQl9Ci0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZXNwYWNlVVJJKCkgewotCi0gICAgICAgIFFOYW1lIG9ialFOYW1lID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE5hbWVzcGFjZVVSSSgpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdOYW1lc3BhY2VVUkkgPSAiIjsKLSAgICAgICAgb2JqUU5hbWUuc2V0TmFtZXNwYWNlVVJJKG5ld05hbWVzcGFjZVVSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhbFBhcnQoKSB7Ci0KLSAgICAgICAgUU5hbWUgb2JqUU5hbWUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldExvY2FsUGFydCgpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMb2NhbFBhcnQgPSAiIjsKLSAgICAgICAgb2JqUU5hbWUuc2V0TG9jYWxQYXJ0KG5ld0xvY2FsUGFydCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRDb21iaW5lZFFOYW1lKCkgewotCi0gICAgICAgIFFOYW1lIG9ialFOYW1lID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUU5hbWUuZ2V0Q29tYmluZWRRTmFtZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRDb21iaW5lZFFOYW1lKCkgewotCi0gICAgICAgIFFOYW1lIG9ialFOYW1lID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0NvbWJpbmVkUU5hbWUgPSAiIjsKLSAgICAgICAgb2JqUU5hbWUuc2V0Q29tYmluZWRRTmFtZShuZXdDb21iaW5lZFFOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEludGVybmFsUHJlZml4T3JOc1VSSSgpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9ialFOYW1lLmdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotICAgIH0KLQotICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKSB7Ci0KLSAgICAgICAgUU5hbWUgb2JqUU5hbWUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3SW50ZXJuYWxQcmVmaXhPck5zVVJJID0gIiI7Ci0gICAgICAgIG9ialFOYW1lLnNldEludGVybmFsUHJlZml4T3JOc1VSSShuZXdJbnRlcm5hbFByZWZpeE9yTnNVUkkpOwotICAgIH0qLwotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFZhbHVlcygpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAicHJlZml4MSI7Ci0gICAgICAgIFN0cmluZyBuc1VSSSA9ICJuc1VSSTEiOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gImxvY2FsUGFydDEiOwotICAgICAgICBvYmpRTmFtZS5zZXRWYWx1ZXMocHJlZml4LCBuc1VSSSwgbG9jYWxQYXJ0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHByZWZpeCxvYmpRTmFtZS5nZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuc1VSSSxvYmpRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsb2NhbFBhcnQsb2JqUU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShRTmFtZVRlc3QuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0NvbW1vbkV4YW1wbGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21tb25FeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTMwYzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0NvbW1vbkV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbW1vbkV4YW1wbGUuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRGlhZ25vc3RpY2lhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSBzYW1wbGUgdXRpbGl0eSBmb3IgdGhlICc8ZW0+PGI+Y29tbW9uPC9iPjwvZW0+JyBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25FeGFtcGxlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIExvYWQgYWxsIHRoZSBhcmd1bWVudCBmaWxlIHBhdGhzIG9yIFVSSXMgYXMgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gYXJncyB0aGUgZmlsZSBwYXRocyBvciBVUklzLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldCB0byBob2xkIHRoZSByZXNvdXJjZXMuCi0JCS8vCi0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQkKLQkJLy8gUmVnaXN0ZXIgdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlIGZhY3RvcnkgdG8gaGFuZGxlIGFsbCBmaWxlIGV4dGVudGlvbnMuCi0JCS8vCi0JCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0Ci0JCQkoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTiwgCi0JCQkgbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0KLQkJLy8gUmVnaXN0ZXIgdGhlIHBhY2thZ2UgdG8gZW5zdXJlIGl0IGlzIGF2YWlsYWJsZSBkdXJpbmcgbG9hZGluZy4KLQkJLy8KLQkJcmVzb3VyY2VTZXQuZ2V0UGFja2FnZVJlZ2lzdHJ5KCkucHV0Ci0JCQkoQ29tbW9uUGFja2FnZS5lTlNfVVJJLCAKLQkJCSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0gICAgICAgIAotCQkvLyBJZiB0aGVyZSBhcmUgbm8gYXJndW1lbnRzLCBlbWl0IGFuIGFwcHJvcHJpYXRlIHVzYWdlIG1lc3NhZ2UuCi0JCS8vCi0JCWlmIChhcmdzLmxlbmd0aCA9PSAwKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVudGVyIGEgbGlzdCBvZiBmaWxlIHBhdGhzIG9yIFVSSXMgdGhhdCBoYXZlIGNvbnRlbnQgbGlrZSB0aGlzOiIpOwotCQkJdHJ5IHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoImh0dHA6Ly8vTXkuY29tbW9uIikpOwotCQkJCUVqYlJlZiByb290ID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWpiUmVmKCk7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocm9vdCk7Ci0JCQkJcmVzb3VyY2Uuc2F2ZShTeXN0ZW0ub3V0LCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBhcmd1bWVudHMuCi0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7Ci0JCQkJLy8gQ29uc3RydWN0IHRoZSBVUkkgZm9yIHRoZSBpbnN0YW5jZSBmaWxlLgotCQkJCS8vIFRoZSBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZSBwYXRoIG9ubHkgaWYgaXQgZGVub3RlcyBhbiBleGlzdGluZyBmaWxlLgotCQkJCS8vIE90aGVyd2lzZSwgaXQncyBkaXJlY3RseSB0cmVhdGVkIGFzIGEgVVJMLgotCQkJCS8vCi0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0JCQkJVVJJIHVyaSA9IGZpbGUuaXNGaWxlKCkgPyBVUkkuY3JlYXRlRmlsZVVSSShmaWxlLmdldEFic29sdXRlUGF0aCgpKTogVVJJLmNyZWF0ZVVSSShhcmdzWzBdKTsKLQotCQkJCXRyeSB7Ci0JCQkJCS8vIERlbWFuZCBsb2FkIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCi0JCQkJCS8vCi0JCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkZWQgIiArIHVyaSk7Ci0KLQkJCQkJLy8gVmFsaWRhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2FkZWQgcmVzb3VyY2UuCi0JCQkJCS8vCi0JCQkJCWZvciAoSXRlcmF0b3IgaiA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkgewotCQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3Qpai5uZXh0KCk7Ci0JCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVPYmplY3QpOwotCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7Ci0JCQkJCQkJcHJpbnREaWFnbm9zdGljKGRpYWdub3N0aWMsICIiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIGxvYWRpbmcgIiArIHVyaSk7Ci0JCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBQcmludHMgZGlhZ25vc3RpY3Mgd2l0aCBpbmRlbnRhdGlvbi4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gZGlhZ25vc3RpYyB0aGUgZGlhZ25vc3RpYyB0byBwcmludC4KLQkgKiBAcGFyYW0gaW5kZW50IHRoZSBpbmRlbnRhdGlvbiBmb3IgcHJpbnRpbmcuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBwcmludERpYWdub3N0aWMoRGlhZ25vc3RpYyBkaWFnbm9zdGljLCBTdHJpbmcgaW5kZW50KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnQoaW5kZW50KTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCXByaW50RGlhZ25vc3RpYygoRGlhZ25vc3RpYylpLm5leHQoKSwgaW5kZW50ICsgIiAgIik7Ci0JCX0KLQl9Ci0KLX0gLy9Db21tb25FeGFtcGxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvQ29tbW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21tb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFlOTMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21tb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21tb25UZXN0cy5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+Y29tbW9uPC9iPjwvZW0+JyBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25UZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBDb21tb25UZXN0cygiY29tbW9uIFRlc3RzIik7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi19IC8vQ29tbW9uVGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0YWQyNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0IGV4dGVuZHMgRGVzY3JpcHRpb25Hcm91cFRlc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IENvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXAgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIENvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXAgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cClmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0Rlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmMDI3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdGlvbiBHcm91cDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uR3JvdXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIERlc2NyaXB0aW9uIEdyb3VwIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRpb25Hcm91cCBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oRGVzY3JpcHRpb25Hcm91cFRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRGVzY3JpcHRpb24gR3JvdXAgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0aW9uR3JvdXBUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGVzY3JpcHRpb24gR3JvdXAgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoRGVzY3JpcHRpb25Hcm91cCBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEZXNjcmlwdGlvbiBHcm91cCB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEZXNjcmlwdGlvbkdyb3VwIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vRGVzY3JpcHRpb25Hcm91cFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9EZXNjcmlwdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9EZXNjcmlwdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhM2Q4YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRGVzY3JpcHRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaXB0aW9uVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBEZXNjcmlwdGlvbiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0aW9uIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihEZXNjcmlwdGlvblRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRGVzY3JpcHRpb24gdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIERlc2NyaXB0aW9uIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKERlc2NyaXB0aW9uIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIERlc2NyaXB0aW9uIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERlc2NyaXB0aW9uIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0Rlc2NyaXB0aW9uVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0Rpc3BsYXlOYW1lVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0Rpc3BsYXlOYW1lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjgwMzkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9EaXNwbGF5TmFtZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlzcGxheU5hbWVUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc3BsYXlOYW1lVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBEaXNwbGF5IE5hbWUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNwbGF5TmFtZSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oRGlzcGxheU5hbWVUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IERpc3BsYXkgTmFtZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzcGxheU5hbWVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGlzcGxheSBOYW1lIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKERpc3BsYXlOYW1lIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIERpc3BsYXkgTmFtZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXNwbGF5TmFtZSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9EaXNwbGF5TmFtZVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9FSkJMb2NhbFJlZlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9FSkJMb2NhbFJlZlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0M2Q0YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRUpCTG9jYWxSZWZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVKQkxvY2FsUmVmVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FSkIgTG9jYWwgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRUpCTG9jYWxSZWZUZXN0IGV4dGVuZHMgRWpiUmVmVGVzdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihFSkJMb2NhbFJlZlRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRUpCIExvY2FsIFJlZiB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUpCTG9jYWxSZWZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRUpCIExvY2FsIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFSkJMb2NhbFJlZiBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gKEVKQkxvY2FsUmVmKWZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUpCTG9jYWxSZWYoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vRUpCTG9jYWxSZWZUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRWpiUmVmVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0VqYlJlZlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1ODdlOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRWpiUmVmVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFamJSZWZUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FamIgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiUmVmVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBFamIgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWpiUmVmIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihFamJSZWZUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEVqYiBSZWYgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYlJlZlRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBFamIgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKEVqYlJlZiBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBFamIgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVqYlJlZiBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFamJSZWYoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vRWpiUmVmVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0VudkVudHJ5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0VudkVudHJ5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTJjMGJlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9FbnZFbnRyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRW52RW50cnlUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudiBFbnRyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVudkVudHJ5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBFbnYgRW50cnkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbnZFbnRyeSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oRW52RW50cnlUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEVudiBFbnRyeSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW52RW50cnlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRW52IEVudHJ5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKEVudkVudHJ5IGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEVudiBFbnRyeSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFbnZFbnRyeSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbnZFbnRyeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9FbnZFbnRyeVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9JY29uVHlwZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9JY29uVHlwZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBiYmZlNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvSWNvblR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEljb25UeXBlVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JY29uIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJY29uVHlwZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgSWNvbiBUeXBlIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSWNvblR5cGUgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKEljb25UeXBlVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBJY29uIFR5cGUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEljb25UeXBlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIEljb24gVHlwZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShJY29uVHlwZSBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBJY29uIFR5cGUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSWNvblR5cGUgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWNvblR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vSWNvblR5cGVUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvSWRlbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvSWRlbnRpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ODBkZmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0lkZW50aXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBJZGVudGl0eVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWRlbnRpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJZGVudGl0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgSWRlbnRpdHkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJZGVudGl0eSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oSWRlbnRpdHlUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IElkZW50aXR5IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJZGVudGl0eVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBJZGVudGl0eSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShJZGVudGl0eSBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBJZGVudGl0eSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJZGVudGl0eSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJZGVudGl0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9JZGVudGl0eVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9KTkRJRW52UmVmc0dyb3VwVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0pORElFbnZSZWZzR3JvdXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDFjMDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0pORElFbnZSZWZzR3JvdXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEpORElFbnZSZWZzR3JvdXBUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkpOREkgRW52IFJlZnMgR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKTkRJRW52UmVmc0dyb3VwVGVzdCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdCB7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBKTkRJIEVudiBSZWZzIEdyb3VwIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKTkRJRW52UmVmc0dyb3VwVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEpOREkgRW52IFJlZnMgR3JvdXAgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSk5ESUVudlJlZnNHcm91cCBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gKEpORElFbnZSZWZzR3JvdXApZml4dHVyZTsKLQl9Ci0KLX0gLy9KTkRJRW52UmVmc0dyb3VwVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0xpc3RlbmVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0xpc3RlbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGNiYTU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9MaXN0ZW5lclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTGlzdGVuZXJUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxpc3RlbmVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJUZXN0IGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKExpc3RlbmVyVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBMaXN0ZW5lciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTGlzdGVuZXIgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdGVuZXIgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIChMaXN0ZW5lcilmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0xpc3RlbmVyVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL01lc3NhZ2VEZXN0aW5hdGlvblJlZlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9NZXNzYWdlRGVzdGluYXRpb25SZWZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGE2ODIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL01lc3NhZ2VEZXN0aW5hdGlvblJlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWVzc2FnZURlc3RpbmF0aW9uUmVmVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25SZWZUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIE1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZURlc3RpbmF0aW9uUmVmIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihNZXNzYWdlRGVzdGluYXRpb25SZWZUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IE1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25SZWZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTWVzc2FnZSBEZXN0aW5hdGlvbiBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoTWVzc2FnZURlc3RpbmF0aW9uUmVmIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIE1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWYoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uUmVmVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL01lc3NhZ2VEZXN0aW5hdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9NZXNzYWdlRGVzdGluYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YmVmNDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL01lc3NhZ2VEZXN0aW5hdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWVzc2FnZURlc3RpbmF0aW9uVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvblRlc3QgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oTWVzc2FnZURlc3RpbmF0aW9uVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBNZXNzYWdlIERlc3RpbmF0aW9uIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTWVzc2FnZSBEZXN0aW5hdGlvbiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRGVzdGluYXRpb24gZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIChNZXNzYWdlRGVzdGluYXRpb24pZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1BhcmFtVmFsdWVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUGFyYW1WYWx1ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2ODMyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUGFyYW1WYWx1ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGFyYW1WYWx1ZVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJhbSBWYWx1ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhcmFtVmFsdWVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFBhcmFtIFZhbHVlIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFyYW1WYWx1ZSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oUGFyYW1WYWx1ZVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgUGFyYW0gVmFsdWUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcmFtVmFsdWVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUGFyYW0gVmFsdWUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoUGFyYW1WYWx1ZSBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQYXJhbSBWYWx1ZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQYXJhbVZhbHVlIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtVmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vUGFyYW1WYWx1ZVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9RTmFtZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9RTmFtZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA4OGIxZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUU5hbWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFFOYW1lVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFFOYW1lVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBRTmFtZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFFOYW1lIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihRTmFtZVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgUU5hbWUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFFOYW1lVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFFOYW1lIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFFOYW1lIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFFOYW1lIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFFOYW1lIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVFOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL1FOYW1lVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1Jlc291cmNlRW52UmVmVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1Jlc291cmNlRW52UmVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWJjNDcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9SZXNvdXJjZUVudlJlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVzb3VyY2VFbnZSZWZUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIEVudiBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUVudlJlZlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgUmVzb3VyY2UgRW52IFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlRW52UmVmIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihSZXNvdXJjZUVudlJlZlRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgUmVzb3VyY2UgRW52IFJlZiB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VFbnZSZWZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUmVzb3VyY2UgRW52IFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShSZXNvdXJjZUVudlJlZiBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBSZXNvdXJjZSBFbnYgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJlc291cmNlRW52UmVmIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlRW52UmVmKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL1Jlc291cmNlRW52UmVmVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1Jlc291cmNlUmVmVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1Jlc291cmNlUmVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWI2MDFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9SZXNvdXJjZVJlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVzb3VyY2VSZWZUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlUmVmVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBSZXNvdXJjZSBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZVJlZiBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oUmVzb3VyY2VSZWZUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFJlc291cmNlIFJlZiB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VSZWZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUmVzb3VyY2UgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFJlc291cmNlUmVmIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFJlc291cmNlIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBSZXNvdXJjZVJlZiBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXNvdXJjZVJlZigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9SZXNvdXJjZVJlZlRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9SdW5Bc1NwZWNpZmllZElkZW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzM5MDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UnVuIEFzIFNwZWNpZmllZCBJZGVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlUZXN0IGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eVRlc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oUnVuQXNTcGVjaWZpZWRJZGVudGl0eVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgUnVuIEFzIFNwZWNpZmllZCBJZGVudGl0eSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUnVuQXNTcGVjaWZpZWRJZGVudGl0eVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBSdW4gQXMgU3BlY2lmaWVkIElkZW50aXR5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIChSdW5Bc1NwZWNpZmllZElkZW50aXR5KWZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9SdW5Bc1NwZWNpZmllZElkZW50aXR5VGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1NlY3VyaXR5SWRlbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlJZGVudGl0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5NjQ1Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlJZGVudGl0eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU2VjdXJpdHlJZGVudGl0eVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZWN1cml0eSBJZGVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5SWRlbnRpdHlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IElkZW50aXR5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlJZGVudGl0eSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oU2VjdXJpdHlJZGVudGl0eVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgU2VjdXJpdHkgSWRlbnRpdHkgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU2VjdXJpdHkgSWRlbnRpdHkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoU2VjdXJpdHlJZGVudGl0eSBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTZWN1cml0eSBJZGVudGl0eSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTZWN1cml0eUlkZW50aXR5IGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3VyaXR5SWRlbnRpdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vU2VjdXJpdHlJZGVudGl0eVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eVJvbGVSZWZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlSb2xlUmVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRiNjMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eVJvbGVSZWZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFNlY3VyaXR5Um9sZVJlZlRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlUmVmVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBTZWN1cml0eSBSb2xlIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3VyaXR5Um9sZVJlZiBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oU2VjdXJpdHlSb2xlUmVmVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBTZWN1cml0eSBSb2xlIFJlZiB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlUmVmVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IFJvbGUgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFNlY3VyaXR5Um9sZVJlZiBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTZWN1cml0eSBSb2xlIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTZWN1cml0eVJvbGVSZWYgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VjdXJpdHlSb2xlUmVmKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL1NlY3VyaXR5Um9sZVJlZlRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eVJvbGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlSb2xlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTE0YTNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eVJvbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFNlY3VyaXR5Um9sZVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eVJvbGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IFJvbGUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZWN1cml0eVJvbGUgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKFNlY3VyaXR5Um9sZVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgU2VjdXJpdHkgUm9sZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IFJvbGUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoU2VjdXJpdHlSb2xlIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IFJvbGUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2VjdXJpdHlSb2xlIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3VyaXR5Um9sZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9TZWN1cml0eVJvbGVUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvVXNlQ2FsbGVySWRlbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvVXNlQ2FsbGVySWRlbnRpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2IzYTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1VzZUNhbGxlcklkZW50aXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVc2VDYWxsZXJJZGVudGl0eVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uVXNlQ2FsbGVySWRlbnRpdHk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VXNlIENhbGxlciBJZGVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVzZUNhbGxlcklkZW50aXR5VGVzdCBleHRlbmRzIFNlY3VyaXR5SWRlbnRpdHlUZXN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKFVzZUNhbGxlcklkZW50aXR5VGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBVc2UgQ2FsbGVyIElkZW50aXR5IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVc2VDYWxsZXJJZGVudGl0eVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBVc2UgQ2FsbGVyIElkZW50aXR5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVzZUNhbGxlcklkZW50aXR5IGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiAoVXNlQ2FsbGVySWRlbnRpdHkpZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9Vc2VDYWxsZXJJZGVudGl0eVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvYXBpL3Rlc3QvQWxsQ29yZUFQSVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2FwaS90ZXN0L0FsbENvcmVBUElUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGQwMTMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvYXBpL3Rlc3QvQWxsQ29yZUFQSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5hcGkudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmFwaS5BbGxBUElUZXN0OwotCi0vKioKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxDb3JlQVBJVGVzdHMgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBKMkVFIENvcmUgQXBpIFRlc3QiKTsKLSAgICAgICAgLy8kSlVuaXQtQkVHSU4kCi0JCXN1aXRlLmFkZFRlc3QoQWxsQVBJVGVzdC5zdWl0ZSgpKTsKLQotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJanVuaXQudGV4dHVpLlRlc3RSdW5uZXIubWFpbihuZXcgU3RyaW5nW10geyBBbGxDb3JlQVBJVGVzdHMuY2xhc3MuZ2V0TmFtZSgpIH0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9hcGkvdGVzdC9BdXRvbWF0ZWRBUElCVlQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvYXBpL3Rlc3QvQXV0b21hdGVkQVBJQlZULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MjRhZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9hcGkvdGVzdC9BdXRvbWF0ZWRBUElCVlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmFwaS50ZXN0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvbWF0ZWRBUElCVlQgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZURpcmVjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgImNvbW1vbkFyY2hpdmVSZXNvdXJjZXMiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiKTsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsgCi0gICAgICAgIAlBdXRvbWF0ZWRBUElCVlQuYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAiY29tbW9uQXJjaGl2ZVJlc291cmNlcyIrIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNpbmcgd29ya2luZyBkaXJlY3Rvcnkgc2luY2UgYSB3b3Jrc3BhY2UgVVJMIGNvdWxkIG5vdCBiZSBsb2NhdGVkLiIpOwotCQl9IAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB1bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgICAgICBpZiAodW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIHVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBdXRvbWF0ZWRBUElCVlQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIEF1dG9tYXRlZEFQSUJWVC5zdWl0ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIGFkZFRlc3Qoc3VpdGUudGVzdEF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3Igb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5hcGkuYnZ0Iik7Ci0gICAgICAgIC8vJEpVbml0LUJFR0lOJAotICAgICAgICBzdWl0ZS5hZGRUZXN0KEFsbENvcmVBUElUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgLy8kSlVuaXQtRU5EJAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9hcGkvQWxsQVBJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9hcGkvQWxsQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWExOGMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvYXBpL0FsbEFQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24udGVzdC5BcHBsaWNhdGlvbkZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLnRlc3QuQXBwbGljYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC50ZXN0LkFwcGxpY2F0aW9uQ2xpZW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQudGVzdC5DbGllbnRGYWN0b3J5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdC5Db21tb25GYWN0b3J5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdC5FamJSZWZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0Lkxpc3RlbmVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdC5RTmFtZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuQXNzZW1ibHlEZXNjcmlwdG9yVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5DTVBBdHRyaWJ1dGVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LkNNUkZpZWxkVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5Db250YWluZXJNYW5hZ2VkRW50aXR5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5FSkJSZWxhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuRUpCUmVsYXRpb25zaGlwUm9sZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuRWpiRmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuRW50aXR5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5NZXRob2RFbGVtZW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5NZXRob2RQZXJtaXNzaW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5RdWVyeU1ldGhvZFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuUXVlcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LlNlc3Npb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS50ZXN0LkNvbm5lY3RvclRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnRlc3QuSmNhRmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLnRlc3QuSnNwRmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24udGVzdC5XZWJhcHBsaWNhdGlvbkZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24udGVzdC5Xc2NvbW1vbkZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC50ZXN0LldzZGRGYWN0b3J5VGVzdDsKLQotCi0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEFsbEFQSVRlc3QgIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCSBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLSAgICAgICAgcmV0dXJuIG5ldyBBbGxBUElUZXN0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBBbGxBUElUZXN0KCl7Ci0gICAgICAgIHN1cGVyKCJKMkVFIENvcmUgQVBJIFRlc3RzIik7Ci0gICAgICAgIGFkZFRlc3QoQXBwbGljYXRpb25GYWN0b3J5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChBcHBsaWNhdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQXBwbGljYXRpb25DbGllbnRUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KENsaWVudEZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KENvbW1vbkZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEVqYlJlZlRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoTGlzdGVuZXJUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFFOYW1lVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChBc3NlbWJseURlc2NyaXB0b3JUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KENNUEF0dHJpYnV0ZVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQ01SRmllbGRUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KENvbnRhaW5lck1hbmFnZWRFbnRpdHlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEVqYkZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEVKQlJlbGF0aW9uc2hpcFJvbGVUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEVKQlJlbGF0aW9uVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChFbnRpdHlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KE1ldGhvZEVsZW1lbnRUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KE1ldGhvZFBlcm1pc3Npb25UZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFF1ZXJ5TWV0aG9kVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChRdWVyeVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoU2Vzc2lvblRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQ29ubmVjdG9yVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChKY2FGYWN0b3J5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChKc3BGYWN0b3J5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChXZWJhcHBsaWNhdGlvbkZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFdzY29tbW9uRmFjdG9yeVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoV3NkZEZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICAKLSAgICB9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9Bc3NlbWJseURlc2NyaXB0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9Bc3NlbWJseURlc2NyaXB0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzZlNDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQXNzZW1ibHlEZXNjcmlwdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLQotcHVibGljIGNsYXNzIEFzc2VtYmx5RGVzY3JpcHRvclRlc3QgZXh0ZW5kcyBFamJFTUZUZXN0QmFzZSB7Ci0KLSAgICAvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkJCi0JcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RQZXJtaXNzaW9uTWV0aG9kRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5pdCgpOwotCQlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChhc3NlbWJseURlc2NyaXB0b3IpOwotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IERELmdldEVKQkphcigpLmdldEVudGVycHJpc2VCZWFucygpOwotCQlFbnRlcnByaXNlQmVhbiBlYjEgPSAoRW50ZXJwcmlzZUJlYW4pZW50ZXJwcmlzZUJlYW5zLmdldCgwKTsKLQkJTGlzdCBtZXRob2RQZXJtaXNzaW9uTGlzdCA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RQZXJtaXNzaW9uTWV0aG9kRWxlbWVudHMoZWIxKTsKLQkJCi0JCQotCQlMaXN0IGFsbE1ldGhvZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHBlcm1pc3Npb25zID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFBlcm1pc3Npb25zKCk7Ci0JCU1ldGhvZFBlcm1pc3Npb24gcGVybWlzc2lvbjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJtaXNzaW9ucy5zaXplKCk7IGkrKyl7Ci0JCQlwZXJtaXNzaW9uID0gKE1ldGhvZFBlcm1pc3Npb24pIHBlcm1pc3Npb25zLmdldChpKTsKLQkJCWFsbE1ldGhvZEVsZW1lbnRzLmFkZEFsbChwZXJtaXNzaW9uLmdldE1ldGhvZEVsZW1lbnRzKGViMSkpOyAKLQkJfQotCQlhc3NlcnRFcXVhbHMobWV0aG9kUGVybWlzc2lvbkxpc3QsYWxsTWV0aG9kRWxlbWVudHMpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV4cGVjdGVkCi0JICogQHBhcmFtIGFjdHVhbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoTGlzdCBleHBlY3RlZCwgTGlzdCBhY3R1YWwpIHsKLQkJYXNzZXJ0RXF1YWxzKGFjdHVhbC5zaXplKCksIGV4cGVjdGVkLnNpemUoKSk7Ci0JCWZvciAoaW50IHg9MDsgeDwgZXhwZWN0ZWQuc2l6ZSgpOyArK3gpIHsKLQkJCU9iamVjdCBvID0gZXhwZWN0ZWQuZ2V0KHgpOwotCQkJYXNzZXJ0RXF1YWxzKGFjdHVhbC5jb250YWlucyhvKSwgdHJ1ZSk7Ci0JCX0KLQotCX0KLQkKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFzc2VtYmx5RGVzY3JpcHRvclRlc3QoInRlc3RfZ2V0TWV0aG9kUGVybWlzc2lvbk1ldGhvZEVsZW1lbnRzIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBc3NlbWJseURlc2NyaXB0b3JUZXN0KCJ0ZXN0X2dldE1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHMiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFzc2VtYmx5RGVzY3JpcHRvclRlc3QoInRlc3RfZ2V0U2VjdXJpdHlSb2xlTmFtZWQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFzc2VtYmx5RGVzY3JpcHRvclRlc3QoInRlc3RfcmVuYW1lU2VjdXJpdHlSb2xlIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBc3NlbWJseURlc2NyaXB0b3JUZXN0KCJ0ZXN0X3JlbW92ZURhdGEiKSk7Ci0JCQotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RQZXJtaXNzaW9uKCkgewotCi0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBvYmpBc3NlbWJseURlc2NyaXB0b3IgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IHNlY3VyaXR5Um9sZXNMaXN0ID0gbnVsbDsKLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXNzZW1ibHlEZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgLmdldE1ldGhvZFBlcm1pc3Npb24oc2VjdXJpdHlSb2xlc0xpc3QpOwotICAgIH0gKi8KLQotIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoYXNzZW1ibHlEZXNjcmlwdG9yKTsKLQkJTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBERC5nZXRFSkJKYXIoKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJRW50ZXJwcmlzZUJlYW4gZWIxID0gKEVudGVycHJpc2VCZWFuKWVudGVycHJpc2VCZWFucy5nZXQoMCk7Ci0JCUxpc3QgbWV0aG9kVHJhbnNhY3Rpb25MaXN0ID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHMoZWIxKTsKLQkJCi0JCQotCQlMaXN0IGFsbE1ldGhvZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRyYW5zYWN0aW9ucyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKTsKLQkJTWV0aG9kVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb247Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNhY3Rpb25zLnNpemUoKTsgaSsrKXsKLQkJCXRyYW5zYWN0aW9uID0gKE1ldGhvZFRyYW5zYWN0aW9uKSB0cmFuc2FjdGlvbnMuZ2V0KGkpOwotCQkJYWxsTWV0aG9kRWxlbWVudHMuYWRkQWxsKHRyYW5zYWN0aW9uLmdldE1ldGhvZEVsZW1lbnRzKGViMSkpOyAKLQkJfQotCQlhc3NlcnRFcXVhbHMobWV0aG9kVHJhbnNhY3Rpb25MaXN0LGFsbE1ldGhvZEVsZW1lbnRzKTsKLSAgICB9Ci0KLQotCi0JcHVibGljIHZvaWQgdGVzdF9nZXRTZWN1cml0eVJvbGVOYW1lZCgpdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWluaXQoKTsKLQkJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoYXNzZW1ibHlEZXNjcmlwdG9yKTsKLQkJU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCQlTdHJpbmcgc2VjdXJpdHlSb2xlTmFtZSA9ICJ0ZXN0Um9sZSI7Ci0JCXNlY3VyaXR5Um9sZS5zZXRSb2xlTmFtZShzZWN1cml0eVJvbGVOYW1lKTsKLQkJYXNzZW1ibHlEZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlKTsKLQkJU2VjdXJpdHlSb2xlIHJldFZhbHVlID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZU5hbWVkKHNlY3VyaXR5Um9sZU5hbWUpIDsKLQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHNlY3VyaXR5Um9sZSk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9yZW5hbWVTZWN1cml0eVJvbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChhc3NlbWJseURlc2NyaXB0b3IpOwotCQlTdHJpbmcgc2VjdXJpdHlSb2xlTmFtZSA9ICJ0ZXN0Um9sZSI7Ci0JCQotCQlTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JCQotCQlzZWN1cml0eVJvbGUuc2V0Um9sZU5hbWUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0JCWFzc2VtYmx5RGVzY3JpcHRvci5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZSk7Ci0JCVN0cmluZyBuZXdTZWN1cml0eVJvbGVOYW1lID0gIm5ld1Rlc3RSb2xlIiA7Ci0JCVNlY3VyaXR5Um9sZSByZXRWYWx1ZSA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRTZWN1cml0eVJvbGVOYW1lZChuZXdTZWN1cml0eVJvbGVOYW1lKSA7Ci0JCWFzc2VydE51bGwocmV0VmFsdWUpOwotCQlhc3NlbWJseURlc2NyaXB0b3IucmVuYW1lU2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZU5hbWUsCi0JCQkJCW5ld1NlY3VyaXR5Um9sZU5hbWUpOwotCQlyZXRWYWx1ZSA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRTZWN1cml0eVJvbGVOYW1lZChuZXdTZWN1cml0eVJvbGVOYW1lKSA7Ci0JCWFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotCQkKLSAgICB9Ci0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kUGVybWlzc2lvbnMoKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kUGVybWlzc2lvbnMoKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RUcmFuc2FjdGlvbnMoKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCk7Ci0gICAgfSAqLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVqYkphcigpIHsKLQotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3Igb2JqQXNzZW1ibHlEZXNjcmlwdG9yID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCSmFyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBc3NlbWJseURlc2NyaXB0b3IuZ2V0RWpiSmFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRFamJKYXIoKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQkphciBuZXdFamJKYXIgPSBudWxsOwotICAgICAgICBvYmpBc3NlbWJseURlc2NyaXB0b3Iuc2V0RWpiSmFyKG5ld0VqYkphcik7Ci0gICAgfSAqLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlY3VyaXR5Um9sZXMoKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBc3NlbWJseURlc2NyaXB0b3IuZ2V0U2VjdXJpdHlSb2xlcygpOwotICAgIH0qLwotCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X2dldEV4Y2x1ZGVMaXN0KCkgewotCi0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBvYmpBc3NlbWJseURlc2NyaXB0b3IgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFeGNsdWRlTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXNzZW1ibHlEZXNjcmlwdG9yLmdldEV4Y2x1ZGVMaXN0KCk7Ci0gICAgfSAqLwotCi0gICAKLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9zZXRFeGNsdWRlTGlzdCgpIHsKLQotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3Igb2JqQXNzZW1ibHlEZXNjcmlwdG9yID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRXhjbHVkZUxpc3QgbmV3RXhjbHVkZUxpc3QgPSBudWxsOwotICAgICAgICBvYmpBc3NlbWJseURlc2NyaXB0b3Iuc2V0RXhjbHVkZUxpc3QobmV3RXhjbHVkZUxpc3QpOwotICAgIH0gKi8KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgewotCi0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBvYmpBc3NlbWJseURlc2NyaXB0b3IgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXNzZW1ibHlEZXNjcmlwdG9yLmdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLSAgICB9ICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChhc3NlbWJseURlc2NyaXB0b3IpOwotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IERELmdldEVKQkphcigpLmdldEVudGVycHJpc2VCZWFucygpOwotCQlFbnRlcnByaXNlQmVhbiBlYjEgPSAoRW50ZXJwcmlzZUJlYW4pZW50ZXJwcmlzZUJlYW5zLmdldCgwKTsKLQkJTGlzdCBtZXRob2RUcmFuc2FjdGlvbkxpc3QgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kVHJhbnNhY3Rpb25NZXRob2RFbGVtZW50cyhlYjEpOwotCQlMaXN0IG1ldGhvZFBlcm1pc3Npb25MaXN0ID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFBlcm1pc3Npb25NZXRob2RFbGVtZW50cyhlYjEpOwotCQlhc3NlcnRFcXVhbHMobWV0aG9kVHJhbnNhY3Rpb25MaXN0LnNpemUoKSA+IDAsIHRydWUpOwotCQlhc3NlcnRFcXVhbHMobWV0aG9kUGVybWlzc2lvbkxpc3Quc2l6ZSgpID4gMCwgdHJ1ZSk7IAotCQkKLQkJYXNzZW1ibHlEZXNjcmlwdG9yLnJlbW92ZURhdGEoZWIxKTsKLQkJCi0JCW1ldGhvZFRyYW5zYWN0aW9uTGlzdCA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzKGViMSk7Ci0JCW1ldGhvZFBlcm1pc3Npb25MaXN0ID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFBlcm1pc3Npb25NZXRob2RFbGVtZW50cyhlYjEpOwotCQlhc3NlcnRFcXVhbHMobWV0aG9kVHJhbnNhY3Rpb25MaXN0LnNpemUoKSA9PSAwLCB0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZFBlcm1pc3Npb25MaXN0LnNpemUoKSA9PSAwLCB0cnVlKTsgCi0gICAgICAgIAotICAgIAkKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NNUEF0dHJpYnV0ZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NNUEF0dHJpYnV0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhZmMwZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9DTVBBdHRyaWJ1dGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDTVBBdHRyaWJ1dGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBFamJGYWN0b3J5IEVKQkZBQ1RPUlkgPSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0JCi0JcHVibGljIENNUEF0dHJpYnV0ZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgQ01QQXR0cmlidXRlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotCQotCX0gIAotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRGaWVsZCgpIHsKLQotICAgICAgICBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRmllbGQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXRGaWVsZCgpOwotICAgIH0gKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0R2V0dGVyTmFtZSgpIHsKLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gImF0dHJOYW1lIiA7Ci0gICAgICAgIFN0cmluZyBnZXR0ZXJOYW1lID0gImdldCIgKyBuYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgKG5hbWUubGVuZ3RoKCkgPiAxID8gbmFtZS5zdWJzdHJpbmcoMSkgOiAiIik7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXROYW1lKG5hbWUpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuZ2V0R2V0dGVyTmFtZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0dGVyTmFtZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRPcmlnaW5hdGluZ1R5cGUoKSB7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhSGVscGVycyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldE9yaWdpbmF0aW5nVHlwZSgpOwotICAgICAgICBhc3NlcnROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgbmV3VmFsdWUgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldE9yaWdpbmF0aW5nVHlwZShuZXdWYWx1ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldE9yaWdpbmF0aW5nVHlwZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsbmV3VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2V0dGVyTmFtZSgpIHsKLSAgICAJICBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9ICJhdHRyTmFtZSIgOwotICAgICAgICAgIFN0cmluZyBzZXR0ZXJOYW1lID0gInNldCIgKyBuYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgKG5hbWUubGVuZ3RoKCkgPiAxID8gbmFtZS5zdWJzdHJpbmcoMSkgOiAiIik7Ci0gICAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldE5hbWUobmFtZSk7Ci0gICAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldFNldHRlck5hbWUoKTsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMoc2V0dGVyTmFtZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotCQlTdHJpbmcgbmFtZSA9ICJhdHRyTmFtZSIgOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0TmFtZShuYW1lKTsKLSAgICAgICBKYXZhSGVscGVycyBuZXdWYWx1ZSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0RVR5cGUobmV3VmFsdWUpOwotICAgICAgICBKYXZhSGVscGVycyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldFR5cGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLHJldFZhbHVlKTsKLSAgICAgICAgCi0JCQotICAgIH0KLQotICAKLQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0NNUkZpZWxkKCkgewotICAgIAlDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAJYm9vbGVhbiByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5pc0NNUkZpZWxkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01SRmllbGQoKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuaXNDTVJGaWVsZCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNLZXkoKSB7Ci0gICAgCUVKQkphciBqYXIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQkphcigpOwotICAgIAlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgIAllbnRpdHkuc2V0TmFtZSgiRm9vIik7Ci0gICAgCWphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5KTsKLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXROYW1lKCJmb29BdHRyIik7Ci0gICAgICAgIGVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpLmFkZChvYmpDTVBBdHRyaWJ1dGUpOwotICAgICAgICBKYXZhSGVscGVycyBuZXdWYWx1ZSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0RVR5cGUobmV3VmFsdWUpOwotICAgICAgICAoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpamFyLmdldEVudGVycHJpc2VCZWFuTmFtZWQoZW50aXR5LmdldE5hbWUoKSkpLmdldENNUEF0dHJpYnV0ZSgpLmFkZChvYmpDTVBBdHRyaWJ1dGUpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgcmV0QXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSllbnRpdHkuZ2V0Q01QQXR0cmlidXRlKCkuZ2V0KDApOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gcmV0QXR0cmlidXRlLmlzS2V5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIExpc3QgbGlzdCA9IGVudGl0eS5nZXRLZXlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGxpc3QuYWRkKG9iakNNUEF0dHJpYnV0ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gcmV0QXR0cmlidXRlLmlzS2V5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzUHJpbUtleUZpZWxkKCkgewotICAgIAlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gZW50aXR5LmdldENNUEF0dHJpYnV0ZSgpOwotICAgICAgICBlbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5hZGQob2JqQ01QQXR0cmlidXRlKTsKLSAgICAgICAgbGlzdC5hZGQob2JqQ01QQXR0cmlidXRlKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5pc1ByaW1LZXlGaWVsZCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICBlbnRpdHkuc2V0UHJpbUtleUZpZWxkKG9iakNNUEF0dHJpYnV0ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmlzUHJpbUtleUZpZWxkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWdpbmF0aW5nVHlwZSgpIHsKLQotICAgIAlDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXRPcmlnaW5hdGluZ1R5cGUoKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIEphdmFIZWxwZXJzIG5ld1ZhbHVlID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXRPcmlnaW5hdGluZ1R5cGUobmV3VmFsdWUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXRPcmlnaW5hdGluZ1R5cGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotICAgIH0qLwotCi0gIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNEZXJpdmVkKCkgewotCi0gICAgCSBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIGJvb2xlYW4gYUJvb2xlYW4gPSBmYWxzZTsKLSAgICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXREZXJpdmVkKGFCb29sZWFuKTsKLSAgICAgICAgIGJvb2xlYW4gcmV0VmFsID0gb2JqQ01QQXR0cmlidXRlLmlzRGVyaXZlZCgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbCxhQm9vbGVhbik7Ci0gICAgICAgICBhQm9vbGVhbiA9IHRydWU7Ci0gICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0RGVyaXZlZChhQm9vbGVhbik7Ci0gICAgICAgICByZXRWYWwgPSBvYmpDTVBBdHRyaWJ1dGUuaXNEZXJpdmVkKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsLGFCb29sZWFuKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlcml2ZWQoKSB7Ci0KLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gYUJvb2xlYW4gPSBmYWxzZTsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldERlcml2ZWQoYUJvb2xlYW4pOwotICAgICAgICBib29sZWFuIHJldFZhbCA9IG9iakNNUEF0dHJpYnV0ZS5pc0Rlcml2ZWQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbCxhQm9vbGVhbik7Ci0gICAgICAgIGFCb29sZWFuID0gdHJ1ZTsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldERlcml2ZWQoYUJvb2xlYW4pOwotICAgICAgICByZXRWYWwgPSBvYmpDTVBBdHRyaWJ1dGUuaXNEZXJpdmVkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWwsYUJvb2xlYW4pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ01QQXR0cmlidXRlVGVzdC5jbGFzcyk7Ci0JfQotCi0gICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NNUkZpZWxkVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQ01SRmllbGRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzc0YjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQ01SRmllbGRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgQ01SRmllbGRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXByb3RlY3RlZCBFamJGYWN0b3J5IEVKQkZBQ1RPUlkgPSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0KLQlwcml2YXRlIENNUkZpZWxkIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRUpCRkFDVE9SWS5jcmVhdGVDTVJGaWVsZCgpOwotCX0KLQkKLSAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkgewotCSAgIAlDTVJGaWVsZCBvYmpDTVJGaWVsZCA9IGdldEluc3RhbmNlKCk7Ci0JICAgIFN0cmluZyB0eXBlTmFtZSA9ICJ0ZXN0TmFtZSI7Ci0JICAgIG9iakNNUkZpZWxkLnNldENvbGxlY3Rpb25UeXBlTmFtZSh0eXBlTmFtZSk7Ci0JICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotCSAgICByZXRWYWx1ZSA9IG9iakNNUkZpZWxkLmdldENvbGxlY3Rpb25UeXBlTmFtZSgpOwotCSAgICBhc3NlcnRFcXVhbHModHlwZU5hbWUscmV0VmFsdWUpOwotICAgIH0KLQotIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29sbGVjdGlvblR5cGVOYW1lKCkgewotCi0gICAgICAgIENNUkZpZWxkIG9iakNNUkZpZWxkID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gInRlc3ROYW1lIjsKLSAgICAgICAgb2JqQ01SRmllbGQuc2V0Q29sbGVjdGlvblR5cGVOYW1lKHR5cGVOYW1lKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01SRmllbGQuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0eXBlTmFtZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlKCkgewotICAgIAkgQ01SRmllbGQgb2JqQ01SRmllbGQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBuZXdSb2xlID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgICBuZXdSb2xlLnNldE5hbWUoIlJvbGUxIik7Ci0gICAgICAgICBvYmpDTVJGaWVsZC5zZXRSb2xlKG5ld1JvbGUpOwotICAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSByZXRWYWx1ZSA9IG9iakNNUkZpZWxkLmdldFJvbGUoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhuZXdSb2xlLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJvbGUoKSB7Ci0gICAgICAgIENNUkZpZWxkIG9iakNNUkZpZWxkID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBuZXdSb2xlID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgIG5ld1JvbGUuc2V0TmFtZSgiUm9sZTEiKTsKLSAgICAgICAgb2JqQ01SRmllbGQuc2V0Um9sZShuZXdSb2xlKTsKLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSByZXRWYWx1ZSA9IG9iakNNUkZpZWxkLmdldFJvbGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld1JvbGUscmV0VmFsdWUpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENvbGxlY3Rpb25UeXBlKCkgewotCi0gICAgCSBDTVJGaWVsZCBvYmpDTVJGaWVsZCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBKYXZhQ2xhc3MgbmV3Q29sbGVjdGlvblR5cGUgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YUNsYXNzKCk7Ci0gICAgICAgICBvYmpDTVJGaWVsZC5zZXRDb2xsZWN0aW9uVHlwZShuZXdDb2xsZWN0aW9uVHlwZSk7Ci0gICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsID0gb2JqQ01SRmllbGQuZ2V0Q29sbGVjdGlvblR5cGUoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhuZXdDb2xsZWN0aW9uVHlwZSxyZXRWYWwpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRDb2xsZWN0aW9uVHlwZSgpIHsKLQotICAgICAgICBDTVJGaWVsZCBvYmpDTVJGaWVsZCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEphdmFDbGFzcyBuZXdDb2xsZWN0aW9uVHlwZSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhQ2xhc3MoKTsKLSAgICAgICAgb2JqQ01SRmllbGQuc2V0Q29sbGVjdGlvblR5cGUobmV3Q29sbGVjdGlvblR5cGUpOwotICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsID0gb2JqQ01SRmllbGQuZ2V0Q29sbGVjdGlvblR5cGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0NvbGxlY3Rpb25UeXBlLHJldFZhbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ01SRmllbGRUZXN0LmNsYXNzKTsKLQl9Ci0KLQotICAgCi0gICAgCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NvbnRhaW5lck1hbmFnZWRFbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9Db250YWluZXJNYW5hZ2VkRW50aXR5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjRkZjVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NvbnRhaW5lck1hbmFnZWRFbnRpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBDb250YWluZXJNYW5hZ2VkRW50aXR5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFamJGYWN0b3J5IEVKQkZBQ1RPUlkgPSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENvbnRhaW5lck1hbmFnZWRFbnRpdHlUZXN0LmNsYXNzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRUpCRkFDVE9SWS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0JfQotICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkS2V5QXR0cmlidXRlTmFtZSgpIHsKLSAgICAJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIGNtcEF0dHJpYnV0ZSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIExpc3QgcGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChjbXBBdHRyaWJ1dGUpOwotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSAiYXR0cjEiIDsKLSAgICAgICAgY21wQXR0cmlidXRlLnNldE5hbWUoYXR0ck5hbWUpOwotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmFkZEtleUF0dHJpYnV0ZU5hbWUoYXR0ck5hbWUpOwotICAgICAgICBMaXN0IGtleXMgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldEtleUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGtleXMuY29udGFpbnMoY21wQXR0cmlidXRlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEZpZWxkIGFGaWVsZCA9IEphdmFSZWZGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCkuY3JlYXRlRmllbGQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSJhdHRyMSIgOwotICAgICAgICBhRmllbGQuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmFkZFBlcnNpc3RlbnRBdHRyaWJ1dGUoYUZpZWxkKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKG5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVOYW1lKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0iYXR0cjEiIDsKLSAgICAgICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVOYW1lKG5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUobmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRLZXlBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBMaXN0IHBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotICAgICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlKTsKLSAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gImF0dHIxIiA7Ci0gICAgICAgIGNtcEF0dHJpYnV0ZS5zZXROYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5hZGRLZXlBdHRyaWJ1dGVOYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRLZXlBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsY21wQXR0cmlidXRlKTsKLSAgICAgICAgCi0gICAgfQotCi0gIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbWFyeUtleUF0dHJpYnV0ZSgpIHsKLQotCSAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgIENNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgTGlzdCBwZXJzaXN0ZW50QXR0cmlidXRlcyA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLSAgICAgIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChjbXBBdHRyaWJ1dGUpOwotICAgICAgU3RyaW5nIGF0dHJOYW1lID0gImF0dHIxIiA7Ci0gICAgICBjbXBBdHRyaWJ1dGUuc2V0TmFtZShhdHRyTmFtZSk7Ci0gICAgICBDTVBBdHRyaWJ1dGUgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFByaW1hcnlLZXlBdHRyaWJ1dGUoKTsKLSAgICAgIGFzc2VydE5vdFNhbWUocmV0VmFsdWUsY21wQXR0cmlidXRlKTsKLSAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0UHJpbUtleUZpZWxkKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UHJpbWFyeUtleUF0dHJpYnV0ZSgpOwotICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGNtcEF0dHJpYnV0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSB7Ci0KLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzS2V5QXR0cmlidXRlKCkgewotCi0gICAgCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBMaXN0IHBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotICAgICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlKTsKLSAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gImF0dHIxIiA7Ci0gICAgICAgIGNtcEF0dHJpYnV0ZS5zZXROYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuaXNLZXlBdHRyaWJ1dGUoY21wQXR0cmlidXRlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5hZGRLZXlBdHRyaWJ1dGVOYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzS2V5QXR0cmlidXRlKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZV8yKCkgewotICAgIAlDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gRUpCRkFDVE9SWS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLSAgICAgICAgTGlzdCBwZXJzaXN0ZW50QXR0cmlidXRlcyA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgcGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9ICJhdHRyMSIgOwotICAgICAgICBjbXBBdHRyaWJ1dGUuc2V0TmFtZShhdHRyTmFtZSk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkucmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwocmV0VmFsdWUpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0KLSAgICAJIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBGaWVsZCBhRmllbGQgPSBKYXZhUmVmRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLmNyZWF0ZUZpZWxkKCk7Ci0gICAgICAgICBTdHJpbmcgbmFtZSA9ImF0dHIxIiA7Ci0gICAgICAgICBhRmllbGQuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuYWRkUGVyc2lzdGVudEF0dHJpYnV0ZShhRmllbGQpOwotICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgICAKLSAgICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKG5hbWUpOwotICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgICAKLSAgICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5yZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlKGFGaWVsZCk7Ci0gICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgIAotICAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUobmFtZSk7Ci0gICAgICAgICBhc3NlcnROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRQcmltS2V5RmllbGQoKSB7Ci0KLSAgCSAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIGNtcEF0dHJpYnV0ZSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIExpc3QgcGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChjbXBBdHRyaWJ1dGUpOwotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSAiYXR0cjEiIDsKLSAgICAgICAgY21wQXR0cmlidXRlLnNldE5hbWUoYXR0ck5hbWUpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFByaW1LZXlGaWVsZCgpOwotICAgICAgICBhc3NlcnROb3RTYW1lKHJldFZhbHVlLGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0UHJpbUtleUZpZWxkKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQcmltS2V5RmllbGQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGNtcEF0dHJpYnV0ZSk7Ci0gIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1ZlcnNpb24xX1goKSB7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0VmVyc2lvbihDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMV9YKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuaXNWZXJzaW9uMV9YKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1gpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuaXNWZXJzaW9uMV9YKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1ZlcnNpb24yX1goKSB7Ci0KLSAgICAJIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFZlcnNpb24oQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzJfWCk7Ci0gICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuaXNWZXJzaW9uMl9YKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFZlcnNpb24oQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzFfWCk7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuaXNWZXJzaW9uMl9YKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2xpc3RQZXJzaXN0ZW50RmllbGROYW1lcygpIHsKLQotICAgIAlDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlMSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZTEgPSAiYXR0cjEiIDsKLSAgICAgICAgY21wQXR0cmlidXRlMS5zZXROYW1lKGF0dHJOYW1lMSk7Ci0gICAgICAgIAotICAgICAgICBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlMiA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZTIgPSAiYXR0cjIiIDsKLSAgICAgICAgY21wQXR0cmlidXRlMi5zZXROYW1lKGF0dHJOYW1lMik7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotICAgICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlMSk7Ci0gICAgICAgIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChjbXBBdHRyaWJ1dGUyKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5Lmxpc3RQZXJzaXN0ZW50RmllbGROYW1lcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmxlbmd0aCA9PSAyLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKChyZXRWYWx1ZVswXT09YXR0ck5hbWUxIHx8IHJldFZhbHVlWzFdPT1hdHRyTmFtZTEpICwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygocmV0VmFsdWVbMF09PWF0dHJOYW1lMiB8fCByZXRWYWx1ZVsxXT09YXR0ck5hbWUyKSAsIHRydWUpOwotICAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1Vua25vd25QcmltYXJ5S2V5KCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0UHJpbWFyeUtleU5hbWUoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzVW5rbm93blByaW1hcnlLZXkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0UHJpbWFyeUtleU5hbWUoImphdmEubGFuZy5PYmplY3QiKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzVW5rbm93blByaW1hcnlLZXkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgfQotICAKLSAgICAvLyBUT0RPCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X21ha2VQcmltS2V5RmllbGRQcm94eSgpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5Lm1ha2VQcmltS2V5RmllbGRQcm94eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxsQXZhaWxhYmxlUXVlcnlNZXRob2RzKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0QWxsQXZhaWxhYmxlUXVlcnlNZXRob2RzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRBdmFpbGFibGVTZWxlY3RRdWVyeU1ldGhvZHMoKSB7Ci0KLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eQotICAgICAgICAgICAgICAgIC5nZXRBdmFpbGFibGVTZWxlY3RRdWVyeU1ldGhvZHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEF2YWlsYWJsZUZpbmRRdWVyeU1ldGhvZHMoKSB7Ci0KLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRBdmFpbGFibGVGaW5kUXVlcnlNZXRob2RzKCk7Ci0gICAgfSAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRDTVBWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFZlcnNpb24oQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzFfWCk7Ci0gICAgICAgIGludCByZXRWYWx1ZSA9IDA7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRDTVBWZXJzaW9uSUQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQsIHJldFZhbHVlKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1gpOwotICAgICAgICAKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldENNUFZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCwgcmV0VmFsdWUpOwotICAgICAgICAKLSAgICB9Ci0gIAotICAgCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q01SRmllbGRzKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0Q01SRmllbGRzKCk7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJvbGVzKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0Um9sZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJvbGUoKSB7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgICBTdHJpbmcgcm9sZU5hbWUgPSAicm9sZTEiOwotICAgICAgICByb2xlLnNldE5hbWUocm9sZU5hbWUpOwotICAgICAgICBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFJvbGUocm9sZU5hbWUpOwotICAgICAgICBhc3NlcnROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRSb2xlcygpLmFkZChyb2xlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFJvbGUocm9sZU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRGaWx0ZXJlZEZlYXR1cmVzKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQkV4dGVuc2lvbkZpbHRlciBhRmlsdGVyID0gbnVsbDsKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRGaWx0ZXJlZEZlYXR1cmVzKGFGaWx0ZXIpOwotICAgIH0gKi8KLQotICAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nIGFOYW1lID0gIiI7Ci0gICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gbnVsbDsKLSAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhTmFtZSk7Ci19Ki8KLQotICAgIAotICAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbigpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFZlcnNpb24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWZXJzaW9uKCkgewotCi0gICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmcgbmV3VmVyc2lvbiA9ICIiOwotICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKLX0qLwotCi0vKiBwdWJsaWMgdm9pZCB0ZXN0X2dldEFic3RyYWN0U2NoZW1hTmFtZSgpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldEFic3RyYWN0U2NoZW1hTmFtZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFic3RyYWN0U2NoZW1hTmFtZSgpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nIG5ld0Fic3RyYWN0U2NoZW1hTmFtZSA9ICIiOwotICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkKLSAgICAgICAgICAgIC5zZXRBYnN0cmFjdFNjaGVtYU5hbWUobmV3QWJzdHJhY3RTY2hlbWFOYW1lKTsKLX0qLwotCi0vKiAgcHVibGljIHZvaWQgdGVzdF9nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotfSovCi0KLS8qcHVibGljIHZvaWQgdGVzdF9nZXRLZXlBdHRyaWJ1dGVzKCkgewotCi0gICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldEtleUF0dHJpYnV0ZXMoKTsKLX0qLwotCi0vKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFF1ZXJpZXMoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UXVlcmllcygpOwotfSovCi0KLS8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldENNUEF0dHJpYnV0ZSgpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRDTVBBdHRyaWJ1dGUoKTsKLX0qLwotCi0vKiAgcHVibGljIHZvaWQgdGVzdF9nZXRQcmltS2V5RmllbGQoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFByaW1LZXlGaWVsZCgpOwotfSovCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VKQkphclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VKQkphclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0ZjI5MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FSkJKYXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgRUpCSmFyVGVzdCBleHRlbmRzICBFamJFTUZUZXN0QmFzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21tb25GYWN0b3J5IENPTU1PTkZBQ1RPUlkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0JcHVibGljIEVKQkphclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCXByaXZhdGUgRUpCSmFyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQkphcigpOwotCX0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0VKQkphcigpIHsKLSAgICAgICAgRUpCSmFyIHRtcEVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wRUpCSmFyKTsKLSAgICB9Ci0gICAgCi0gICAKLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNDb250YWluZXJNYW5hZ2VkQmVhbnMoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbik7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmNvbnRhaW5zQ29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5KTsKLSAgICAgICAgCi0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmNvbnRhaW5zQ29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zU2VjdXJpdHlSb2xlKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICAgICAgb2JqRUpCSmFyLnNldEFzc2VtYmx5RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzZWN1cml0eVJvbGVOYW1lID0gInRlc3RSb2xlIjsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5jb250YWluc1NlY3VyaXR5Um9sZShzZWN1cml0eVJvbGVOYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCBmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCQlzZWN1cml0eVJvbGUuc2V0Um9sZU5hbWUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0JCWRlc2NyaXB0b3IuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChzZWN1cml0eVJvbGUpOwotCQlyZXRWYWx1ZSA9IG9iakVKQkphci5jb250YWluc1NlY3VyaXR5Um9sZShzZWN1cml0eVJvbGVOYW1lKSA7Ci0JCWFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJlYW5NYW5hZ2VkQmVhbnMoKSB7Ci0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24pOwotICAgICAgICAKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEJlYW5NYW5hZ2VkQmVhbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MCx0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIEVudGl0eSBlbnRpdHkgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlRW50aXR5KCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5KTsKLSAgICAgICAgCi0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEJlYW5NYW5hZ2VkQmVhbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MSx0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmdldCgwKSxlbnRpdHkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotICAgIAkKLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbik7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTAsdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5KTsKLSAgICAgICAgCi0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldENvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0xLHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuZ2V0KDApLGVudGl0eSk7Ci0gICAgfQotICAgIAotICAgCi0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVKQjExQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotCi0gICAgCSAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24pOwotICAgICAgICAgIAotICAgICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVKQjExQ29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MCx0cnVlKTsKLSAgICAgICAgICAKLSAgICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eTEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5MSk7Ci0gICAgICAgICAgZW50aXR5MS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8xX1gpOwotICAgICAgICAgIAotICAgICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5MiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChlbnRpdHkyKTsKLSAgICAgICAgICBlbnRpdHkyLnNldFZlcnNpb24oQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzJfWCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgCi0gICAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RUpCMTFDb250YWluZXJNYW5hZ2VkQmVhbnMoKTsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0xLHRydWUpOwotICAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5nZXQoMCksZW50aXR5MSk7Ci0gICAgfQotICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RUpCMjBDb250YWluZXJNYW5hZ2VkQmVhbnMoKSB7Ci0KLSAgCSAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uKTsKLSAgICAgIAotICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFSkIyMENvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MCx0cnVlKTsKLSAgICAgIAotICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkxID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5MSk7Ci0gICAgICBlbnRpdHkxLnNldFZlcnNpb24oQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzFfWCk7Ci0gICAgICAKLSAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5MiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eTIpOwotICAgICAgZW50aXR5Mi5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1gpOwotICAgICAgCi0gICAgICAKLSAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVKQjIwQ29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0gICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0xLHRydWUpOwotICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmdldCgwKSxlbnRpdHkyKTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2VEcml2ZW5CZWFucygpIHsKLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbik7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTAsdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlRHJpdmVuIG1lc3NhZ2VEcml2ZW4gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlTWVzc2FnZURyaXZlbigpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKG1lc3NhZ2VEcml2ZW4pOwotICAgICAgICAKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTEsdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5nZXQoMCksbWVzc2FnZURyaXZlbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFamJSZWxhdGlvbnMoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRSZWxhdGlvbnNoaXBMaXN0KHJlbGF0aW9uc2hpcHMpOwotICAgICAgICByZWxhdGlvbnNoaXBzLnNldEVqYkphcihvYmpFSkJKYXIpOwotICAgICAgICBFTGlzdCBlamJSZWxhdGlvbnMgPSByZWxhdGlvbnNoaXBzLmdldEVqYlJlbGF0aW9ucygpOwotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RWpiUmVsYXRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoZWpiUmVsYXRpb25zLHJldFZhbHVlKTsKLSAgICB9Ci0gICAgCi0KLSAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZigpIHsKLSAgICAJCi0gICAgCUVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICAgICAgb2JqRUpCSmFyLnNldEFzc2VtYmx5RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgIAotICAgIAlFamJSZWYgZWpiUmVmID0gQ09NTU9ORkFDVE9SWS5jcmVhdGVFamJSZWYoKTsKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMSA9ICJOYW1lMSI7Ci0gICAgCXNlc3Npb24xLnNldE5hbWUobmFtZTEpOwotICAgIAkKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMiA9ICJOYW1lMiI7Ci0gICAgCXNlc3Npb24yLnNldE5hbWUobmFtZTIpOwotICAgIAkKLSAgICAJZWpiUmVmLnNldExpbmsobmFtZTIpOwotICAgIAllamJSZWYuc2V0TmFtZSgiRWpiUmVmXyIgKyBuYW1lMik7Ci0gICAgCQotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24xKTsKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMik7Ci0gICAgCQotICAgICAgICBFbnRlcnByaXNlQmVhbiByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihlamJSZWYpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2Vzc2lvbjIscmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZCgpIHsKLQotICAgIAlFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMSA9ICJOYW1lMSI7Ci0gICAgCXNlc3Npb24xLnNldE5hbWUobmFtZTEpOwotICAgIAkKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMiA9ICJOYW1lMiI7Ci0gICAgCXNlc3Npb24yLnNldE5hbWUobmFtZTIpOwotICAgIAkKLSAgICAgICAgCQotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24xKTsKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMik7Ci0gICAgCQotICAgICAgICBFbnRlcnByaXNlQmVhbiByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbk5hbWVkKG5hbWUyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlc3Npb24yLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVudGVycHJpc2VCZWFuc1dpdGhSZWZlcmVuY2UoKSB7Ci0KLSAgICAJRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgICAgICBvYmpFSkJKYXIuc2V0QXNzZW1ibHlEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICAgCi0gICAgCVNlc3Npb24gc2Vzc2lvbjEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAJCi0gICAgCVNlc3Npb24gc2Vzc2lvbjIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTIgPSAiTmFtZTIiOwotICAgIAlzZXNzaW9uMi5zZXROYW1lKG5hbWUyKTsKLSAgICAJCi0gICAgICAgIAkKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMSk7Ci0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjIpOwotICAgIAkKLSAgICAJSmF2YUNsYXNzIGphdmFDbGFzczEgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5TdHJpbmciKSA7Ci0gICAgCUphdmFDbGFzcyBqYXZhQ2xhc3MyID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLnV0aWwuTGlzdCIpIDsKLSAgICAJCi0gICAgCXNlc3Npb24xLnNldEVqYkNsYXNzKGphdmFDbGFzczEpOwotICAgIAlzZXNzaW9uMi5zZXRFamJDbGFzcyhqYXZhQ2xhc3MyKTsKLSAgICAJCi0gICAgICAgICBqYXZhLnV0aWwuTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnNXaXRoUmVmZXJlbmNlKGphdmFDbGFzczEpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MSwgdHJ1ZSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuY29udGFpbnMoc2Vzc2lvbjEpLCB0cnVlKTsKLSAgICAgICAgIAotICAgICAgICAgc2Vzc2lvbjIuc2V0SG9tZUludGVyZmFjZShqYXZhQ2xhc3MxKTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFuc1dpdGhSZWZlcmVuY2UoamF2YUNsYXNzMSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0yLCB0cnVlKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5jb250YWlucyhzZXNzaW9uMSksIHRydWUpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmNvbnRhaW5zKHNlc3Npb24yKSwgdHJ1ZSk7Ci0gICAgICAgICAKLSAgICB9Ci0gICAgCi0gIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFbnRlcnByaXNlQmVhbldpdGhSZWZlcmVuY2UoKSB7Ci0gICAgCQotICAgIAlFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMSA9ICJOYW1lMSI7Ci0gICAgCXNlc3Npb24xLnNldE5hbWUobmFtZTEpOwotICAgIAkKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMiA9ICJOYW1lMiI7Ci0gICAgCXNlc3Npb24yLnNldE5hbWUobmFtZTIpOwotICAgIAkKLSAgICAgICAgCQotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24xKTsKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMik7Ci0gICAgCQotICAgIAlKYXZhQ2xhc3MgamF2YUNsYXNzMSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5sYW5nLlN0cmluZyIpIDsKLSAgICAJCi0gICAgCXNlc3Npb24xLnNldEVqYkNsYXNzKGphdmFDbGFzczEpOwotICAgIAlzZXNzaW9uMi5zZXRFamJDbGFzcyhqYXZhQ2xhc3MxKTsKLSAgICAJCi0gICAgCUVudGVycHJpc2VCZWFuIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5XaXRoUmVmZXJlbmNlKGphdmFDbGFzczEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIHNlc3Npb24xKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZXNzaW9uQmVhbnMoKSB7ICAgICAKLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1lc3NhZ2VEcml2ZW4gbWVzc2FnZURyaXZlbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVNZXNzYWdlRHJpdmVuKCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQobWVzc2FnZURyaXZlbik7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldFNlc3Npb25CZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0wLHRydWUpOwotICAgICAgICAKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRTZXNzaW9uQmVhbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MSx0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmNvbnRhaW5zKHNlc3Npb24pLCB0cnVlKTsKLSAgICAgICAgCi0gICAgfQotCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfcmVuYW1lU2VjdXJpdHlSb2xlKCkgewotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBleGlzdGluZ1JvbGVOYW1lID0gIiI7Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmV3Um9sZU5hbWUgPSAiIjsKLSAgICAgICAgb2JqRUpCSmFyLnJlbmFtZVNlY3VyaXR5Um9sZShleGlzdGluZ1JvbGVOYW1lLCBuZXdSb2xlTmFtZSk7Ci0gICAgfSAqLwotCi0gIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RWpiQ2xpZW50SmFyKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRFamJDbGllbnRKYXIoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdFamJDbGllbnRKYXIgPSAiIjsKLSAgICAgICAgb2JqRUpCSmFyLnNldEVqYkNsaWVudEphcihuZXdFamJDbGllbnRKYXIpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb24oKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRWZXJzaW9uKCk7Ci0gICAgfSovCi0gICAgCi0gICAKLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbklEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKEVKQik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBpbnQgcmV0VmFsdWUgPSAwOwotICAgICAgICByZXRWYWx1ZSA9IERELmdldEVKQkphcigpLmdldFZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRCk7Ci0gICAgICAgIAotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRFSkJKYXIoKS5nZXRWZXJzaW9uSUQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpOwotCSAgICAKLQkgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMik7Ci0JCXJldFZhbHVlID0gREQuZ2V0RUpCSmFyKCkuZ2V0VmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEKTsJICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShFSkIpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgaW50IHJldFZhbHVlID0gMDsKLSAgICAgICAgcmV0VmFsdWUgPSBERC5nZXRFSkJKYXIoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0gICAgICAgIAotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRFSkJKYXIoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JICAgIAotCSAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8yKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRFSkJKYXIoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0gICAgfQotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X3NldFZlcnNpb24oKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdWZXJzaW9uID0gIiI7Ci0gICAgICAgIG9iakVKQkphci5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgfQotCi0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciA9IG51bGw7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IobmV3QXNzZW1ibHlEZXNjcmlwdG9yKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRFbnRlcnByaXNlQmVhbnMoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVsYXRpb25zaGlwTGlzdCgpIHsKLQotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVsYXRpb25zaGlwcyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldFJlbGF0aW9uc2hpcExpc3QoKTsKLSAgICB9Ci0KLSAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVsYXRpb25zaGlwTGlzdCgpIHsKLQotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVsYXRpb25zaGlwcyBuZXdSZWxhdGlvbnNoaXBMaXN0ID0gbnVsbDsKLSAgICAgICAgb2JqRUpCSmFyLnNldFJlbGF0aW9uc2hpcExpc3QobmV3UmVsYXRpb25zaGlwTGlzdCk7Ci0gICAgfQotKi8KLSAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFSkJSZWxhdGlvbigpIHsKLSAgICAJIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgUmVsYXRpb25zaGlwcyByZWxhdGlvbnNoaXBzID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVJlbGF0aW9uc2hpcHMoKTsKLSAgICAgICAgIG9iakVKQkphci5zZXRSZWxhdGlvbnNoaXBMaXN0KHJlbGF0aW9uc2hpcHMpOwotICAgICAgICAgcmVsYXRpb25zaGlwcy5zZXRFamJKYXIob2JqRUpCSmFyKTsKLSAgICAgICAKLSAgICAgICAgIEVKQlJlbGF0aW9uIHJlbGF0aW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0gICAgICAgICBTdHJpbmcgYVJlbGF0aW9uTmFtZSA9ICJSZWxhdGlvbjEiOwotICAgICAgICAgcmVsYXRpb24uc2V0TmFtZShhUmVsYXRpb25OYW1lKTsKLSAgICAgICAgIAotICAgICAgICAgcmVsYXRpb25zaGlwcy5nZXRFamJSZWxhdGlvbnMoKS5hZGQocmVsYXRpb24pOwotICAgICAgICAgRUpCUmVsYXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RUpCUmVsYXRpb24oYVJlbGF0aW9uTmFtZSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIHJlbGF0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RUpCUmVsYXRpb25zRm9yU291cmNlKCkgewotICAgIAkKLSAgICAJRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRSZWxhdGlvbnNoaXBMaXN0KHJlbGF0aW9uc2hpcHMpOwotICAgICAgICByZWxhdGlvbnNoaXBzLnNldEVqYkphcihvYmpFSkJKYXIpOwotICAgICAgCi0gICAgICAgIEVKQlJlbGF0aW9uIHJlbGF0aW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhUmVsYXRpb25OYW1lID0gIlJlbGF0aW9uMSI7Ci0gICAgICAgIHJlbGF0aW9uLnNldE5hbWUoYVJlbGF0aW9uTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgCi0gICAgCUxpc3Qgcm9sZUxpc3QgPSByZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTEpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTIpOwotICAgICAgICAKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IHRhcmdldEVudGl0eSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIAotCSAgICBSb2xlU291cmNlIHJvbGVTb3VyY2UgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlUm9sZVNvdXJjZSgpOwotCSAgICByb2xlU291cmNlLnNldEVudGl0eUJlYW4oZW50aXR5KTsKLQkgICAgcm9sZVNvdXJjZS5zZXRSb2xlKHJvbGUxKTsKLQkgICAgcm9sZTEuc2V0U291cmNlKHJvbGVTb3VyY2UpOwotCSAgICAKLQkgICAgUm9sZVNvdXJjZSB0YXJnZXRSb2xlU291cmNlID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVJvbGVTb3VyY2UoKTsKLQkgICAgdGFyZ2V0Um9sZVNvdXJjZS5zZXRFbnRpdHlCZWFuKHRhcmdldEVudGl0eSk7Ci0JICAgIHRhcmdldFJvbGVTb3VyY2Uuc2V0Um9sZShyb2xlMik7Ci0JICAgIHJvbGUyLnNldFNvdXJjZSh0YXJnZXRSb2xlU291cmNlKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFSkJSZWxhdGlvbnNGb3JTb3VyY2UoZW50aXR5KTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpLDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuY29udGFpbnMocmVsYXRpb24pLHRydWUpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVKQlJlbGF0aW9uc2hpcFJvbGVzRm9yVHlwZSgpIHsKLQotICAgIAlFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVsYXRpb25zaGlwcyByZWxhdGlvbnNoaXBzID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVJlbGF0aW9uc2hpcHMoKTsKLSAgICAgICAgb2JqRUpCSmFyLnNldFJlbGF0aW9uc2hpcExpc3QocmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIHJlbGF0aW9uc2hpcHMuc2V0RWpiSmFyKG9iakVKQkphcik7Ci0gICAgICAKLSAgICAgICAgRUpCUmVsYXRpb24gcmVsYXRpb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlRUpCUmVsYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIGFSZWxhdGlvbk5hbWUgPSAiUmVsYXRpb24xIjsKLSAgICAgICAgcmVsYXRpb24uc2V0TmFtZShhUmVsYXRpb25OYW1lKTsKLSAgICAgICAgCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUyID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAKLSAgICAJTGlzdCByb2xlTGlzdCA9IHJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMSk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMik7Ci0gICAgICAgIAotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICAgICAgCi0JICAgIFJvbGVTb3VyY2Ugcm9sZVNvdXJjZSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVSb2xlU291cmNlKCk7Ci0JICAgIHJvbGVTb3VyY2Uuc2V0RW50aXR5QmVhbihlbnRpdHkpOwotCSAgICByb2xlU291cmNlLnNldFJvbGUocm9sZTEpOwotCSAgICByb2xlMS5zZXRTb3VyY2Uocm9sZVNvdXJjZSk7Ci0JICAgIAotCSAgICBSb2xlU291cmNlIHRhcmdldFJvbGVTb3VyY2UgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlUm9sZVNvdXJjZSgpOwotCSAgICB0YXJnZXRSb2xlU291cmNlLnNldEVudGl0eUJlYW4odGFyZ2V0RW50aXR5KTsKLQkgICAgdGFyZ2V0Um9sZVNvdXJjZS5zZXRSb2xlKHJvbGUyKTsKLQkgICAgcm9sZTIuc2V0U291cmNlKHRhcmdldFJvbGVTb3VyY2UpOwotICAgICAgICAKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVzRm9yVHlwZSh0YXJnZXRFbnRpdHkpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCksMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5jb250YWlucyhyZWxhdGlvbiksdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9FSkJKYXIiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfY29udGFpbnNDb250YWluZXJNYW5hZ2VkQmVhbnMiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfY29udGFpbnNTZWN1cml0eVJvbGUiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0QmVhbk1hbmFnZWRCZWFucyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRDb250YWluZXJNYW5hZ2VkQmVhbnMiKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEVKQjExQ29udGFpbmVyTWFuYWdlZEJlYW5zIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEVKQjIwQ29udGFpbmVyTWFuYWdlZEJlYW5zIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldE1lc3NhZ2VEcml2ZW5CZWFucyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFamJSZWxhdGlvbnMiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYiKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEVudGVycHJpc2VCZWFuTmFtZWQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RW50ZXJwcmlzZUJlYW5zV2l0aFJlZmVyZW5jZSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFbnRlcnByaXNlQmVhbldpdGhSZWZlcmVuY2UiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0U2Vzc2lvbkJlYW5zIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldFZlcnNpb25JRCIpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0SjJFRVZlcnNpb25JRCIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFSkJSZWxhdGlvbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFSkJSZWxhdGlvbnNGb3JTb3VyY2UiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RUpCUmVsYXRpb25zaGlwUm9sZXNGb3JUeXBlIikpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRUpCUmVsYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FSkJSZWxhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjY2VjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FSkJSZWxhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLQotcHVibGljIGNsYXNzIEVKQlJlbGF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgRWpiRmFjdG9yeSBFSkJGQUNUT1JZID0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotCXByaXZhdGUgRUpCUmVsYXRpb24gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFSkJSZWxhdGlvbigpOwotCX0KLQkgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShFSkJSZWxhdGlvblRlc3QuY2xhc3MpOwotCX0KLQkgCi0gICAgcHVibGljIHZvaWQgdGVzdF9FSkJSZWxhdGlvbigpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiB0bXBFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wRUpCUmVsYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNSZWxhdGlvbnNoaXBSb2xlKCkgewotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb24uY29udGFpbnNSZWxhdGlvbnNoaXBSb2xlKHJvbGUxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLHJldFZhbHVlKTsKLSAgICAgICAgTGlzdCByb2xlTGlzdCA9IG9iakVKQlJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMSk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMik7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb24uY29udGFpbnNSZWxhdGlvbnNoaXBSb2xlKHJvbGUxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUscmV0VmFsdWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRGaXJzdFJvbGUoKSB7Ci0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTEgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMiA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3Qgcm9sZUxpc3QgPSBvYmpFSkJSZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTEpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTIpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbi5nZXRGaXJzdFJvbGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGUxLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE9wcG9zaXRlUm9sZSgpIHsKLSAgICAJCi0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTEgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMiA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb3BwUm9sZSA9IG9iakVKQlJlbGF0aW9uLmdldE9wcG9zaXRlUm9sZShyb2xlMSk7Ci0gICAgICAgIGFzc2VydE51bGwob3BwUm9sZSk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHJvbGVMaXN0ID0gb2JqRUpCUmVsYXRpb24uZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUxKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUyKTsKLSAgICAgICAgCi0gICAgICAgIG9wcFJvbGUgPSBvYmpFSkJSZWxhdGlvbi5nZXRPcHBvc2l0ZVJvbGUocm9sZTEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocm9sZTIsb3BwUm9sZSk7Ci0gICAgICAgIAotICAgICAgICBvcHBSb2xlID0gb2JqRUpCUmVsYXRpb24uZ2V0T3Bwb3NpdGVSb2xlKHJvbGUyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGUxLG9wcFJvbGUpOwotICAgIH0KLQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlY29uZFJvbGUoKSB7Ci0KLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMSA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUyID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uIG9iakVKQlJlbGF0aW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGlzdCByb2xlTGlzdCA9IG9iakVKQlJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMSk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMik7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmdldFNlY29uZFJvbGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGUyLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEZvd2FyZCgpIHsKLQotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IHJvbGVMaXN0ID0gb2JqRUpCUmVsYXRpb24uZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUxKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUyKTsKLSAgICAgICAgCi0gICAgICAgIG9iakVKQlJlbGF0aW9uLnNldEZvd2FyZChyb2xlMik7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmdldEZpcnN0Um9sZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocm9sZTIscmV0VmFsdWUpOwotICAgIH0KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpFSkJSZWxhdGlvbi5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfSovCi0KLSAgLyogcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uIG9iakVKQlJlbGF0aW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb24uZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TmFtZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdOYW1lID0gIiI7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uLnNldE5hbWUobmV3TmFtZSk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVsYXRpb25zaGlwTGlzdCgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcExpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJlbGF0aW9uc2hpcExpc3QoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZWxhdGlvbnNoaXBzIG5ld1JlbGF0aW9uc2hpcExpc3QgPSBudWxsOwotICAgICAgICBvYmpFSkJSZWxhdGlvbi5zZXRSZWxhdGlvbnNoaXBMaXN0KG5ld1JlbGF0aW9uc2hpcExpc3QpOwotICAgIH0KLQotIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uIG9iakVKQlJlbGF0aW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmdldERlc2NyaXB0aW9ucygpOwotICAgIH0qLwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRUpCUmVsYXRpb25zaGlwUm9sZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VKQlJlbGF0aW9uc2hpcFJvbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmMwNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRUpCUmVsYXRpb25zaGlwUm9sZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk11bHRpcGxpY2l0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBFSkJSZWxhdGlvbnNoaXBSb2xlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgRWpiRmFjdG9yeSBFSkJGQUNUT1JZID0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTEgPSBudWxsLCByb2xlMiA9IG51bGw7Ci0JQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBudWxsOwotCUVKQlJlbGF0aW9uIGVqYlJlbGF0aW9uID0gbnVsbCA7Ci0JCi0JIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRUpCUmVsYXRpb25zaGlwUm9sZVRlc3QuY2xhc3MpOwotCX0KLQkgCi0JcHJpdmF0ZSBFSkJSZWxhdGlvbnNoaXBSb2xlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHRlc3RfRUpCUmVsYXRpb25zaGlwUm9sZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHRtcEVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcEVKQlJlbGF0aW9uc2hpcFJvbGUpOwotICAgIH0KLQotICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb2dpY2FsTmFtZSgpIHsKLQotICAgICAgIC8qIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0TG9naWNhbE5hbWUoKTsqLwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICJyb2xlMSI7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5nZXROYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuYW1lLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE9wcG9zaXRlKCkgewotICAgIAlpbml0KCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IHJvbGUxLmdldE9wcG9zaXRlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxyb2xlMik7Ci0gICAgICAgIHJldFZhbHVlID0gcm9sZTIuZ2V0T3Bwb3NpdGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHJvbGUxKTsKLSAgICB9Ci0KLSAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U291cmNlRW50aXR5KCkgewotCSAgICBpbml0KCk7Ci0JICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgcmV0VmFsdWUgPSByb2xlMS5nZXRTb3VyY2VFbnRpdHkoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGVudGl0eSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0ZvcndhcmQoKSB7Ci0gICAgICAgCWluaXQoKTsKLQkgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHJvbGUyLmlzRm9yd2FyZCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotCSAgICByb2xlMi5zZXRGb3dhcmQoKTsKLQkgICAgcmV0VmFsdWUgPSByb2xlMi5pc0ZvcndhcmQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotCSAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzS2V5KCkgewotICAgIAlpbml0KCk7Ci0JICAgIGJvb2xlYW4gcmV0VmFsdWUgPSByb2xlMi5pc0tleSgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotCSAgICByb2xlMi5zZXRLZXkodHJ1ZSk7Ci0JICAgIHJldFZhbHVlID0gcm9sZTIuaXNLZXkoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0S2V5KCkgewotCi0gICAgCWluaXQoKTsKLQkgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHJvbGUyLmlzS2V5KCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0JICAgIHJvbGUyLnNldEtleSh0cnVlKTsKLQkgICAgcmV0VmFsdWUgPSByb2xlMi5pc0tleSgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgIAlyb2xlMSA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCQlyb2xlMiA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCSAgICBlamJSZWxhdGlvbiA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb24oKTsKLQkgICAgZW50aXR5ID0gRUpCRkFDVE9SWS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0JICAgIFJvbGVTb3VyY2Ugcm9sZVNvdXJjZSA9IEVKQkZBQ1RPUlkuY3JlYXRlUm9sZVNvdXJjZSgpOwotCSAgICByb2xlU291cmNlLnNldEVudGl0eUJlYW4oZW50aXR5KTsKLQkgICAgcm9sZVNvdXJjZS5zZXRSb2xlKHJvbGUxKTsKLQkgICAgcm9sZTEuc2V0U291cmNlKHJvbGVTb3VyY2UpOwotCSAgICBMaXN0IHJvbGVMaXN0ID0gZWpiUmVsYXRpb24uZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQkgICAgcm9sZUxpc3QuYWRkKHJvbGUxKTsKLQkgICAgcm9sZUxpc3QuYWRkKHJvbGUyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTWFueSgpIHsKLSAgICAJaW5pdCgpOwotCSAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0JICAgIHJldFZhbHVlID0gcm9sZTEuaXNNYW55KCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSkgOwotCSAgICByb2xlMi5zZXRNdWx0aXBsaWNpdHkoTXVsdGlwbGljaXR5S2luZC5NQU5ZX0xJVEVSQUwpOwotCSAgICByZXRWYWx1ZSA9IHJvbGUxLmlzTWFueSgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSkgOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNOYXZpZ2FibGUoKSB7Ci0gICAgCWluaXQoKTsKLSAgICAJYm9vbGVhbiByZXRWYWx1ZSA9IHJvbGUxLmlzTmF2aWdhYmxlKCk7Ci0gICAgCWFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgCUNNUkZpZWxkIGNtckZpZWxkID0gRUpCRkFDVE9SWS5jcmVhdGVDTVJGaWVsZCgpOwotICAgIAlyb2xlMS5zZXRDbXJGaWVsZChjbXJGaWVsZCk7Ci0gICAgCXJldFZhbHVlID0gcm9sZTEuaXNOYXZpZ2FibGUoKTsKLSAgICAJYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEZvd2FyZCgpIHsKLSAgICAJaW5pdCgpOwotCSAgICBib29sZWFuIHJldFZhbHVlID0gcm9sZTIuaXNGb3J3YXJkKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0JICAgIHJvbGUyLnNldEZvd2FyZCgpOwotCSAgICByZXRWYWx1ZSA9IHJvbGUyLmlzRm9yd2FyZCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXROYW1lKCkgewotCi0gICAgCSBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgU3RyaW5nIG5hbWUgPSAicm9sZTEiOwotICAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXROYW1lKG5hbWUpOwotICAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0TmFtZSgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUscmV0VmFsdWUpOwotICAgIH0KLQotICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlTmFtZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldFJvbGVOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSb2xlTmFtZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3Um9sZU5hbWUgPSAiIjsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRSb2xlTmFtZShuZXdSb2xlTmFtZSk7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TXVsdGlwbGljaXR5KCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE11bHRpcGxpY2l0eUtpbmQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0TXVsdGlwbGljaXR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRNdWx0aXBsaWNpdHkoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTXVsdGlwbGljaXR5S2luZCBuZXdNdWx0aXBsaWNpdHkgPSBudWxsOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnNldE11bHRpcGxpY2l0eShuZXdNdWx0aXBsaWNpdHkpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0TXVsdGlwbGljaXR5KCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUudW5zZXRNdWx0aXBsaWNpdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0TXVsdGlwbGljaXR5KCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmlzU2V0TXVsdGlwbGljaXR5KCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfaXNDYXNjYWRlRGVsZXRlKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmlzQ2FzY2FkZURlbGV0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2FzY2FkZURlbGV0ZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIG5ld0Nhc2NhZGVEZWxldGUgPSBmYWxzZTsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRDYXNjYWRlRGVsZXRlKG5ld0Nhc2NhZGVEZWxldGUpOwotICAgIH0qLwotCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0Q2FzY2FkZURlbGV0ZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnVuc2V0Q2FzY2FkZURlbGV0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTZXRDYXNjYWRlRGVsZXRlKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmlzU2V0Q2FzY2FkZURlbGV0ZSgpOwotICAgIH0qLwotCi0gICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRSZWxhdGlvbnNoaXAoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0UmVsYXRpb25zaGlwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSZWxhdGlvbnNoaXAoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gbmV3Q29udGFpbmVyID0gbnVsbDsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRSZWxhdGlvbnNoaXAobmV3Q29udGFpbmVyKTsKLSAgICB9Ki8KLQotICAgLypwdWJsaWMgdm9pZCB0ZXN0X2dldFNvdXJjZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSb2xlU291cmNlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldFNvdXJjZSgpOwotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U291cmNlKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJvbGVTb3VyY2UgbmV3U291cmNlID0gbnVsbDsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRTb3VyY2UobmV3U291cmNlKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRDbXJGaWVsZCgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVJGaWVsZCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5nZXRDbXJGaWVsZCgpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRDbXJGaWVsZCgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVJGaWVsZCBuZXdDbXJGaWVsZCA9IG51bGw7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0Q21yRmllbGQobmV3Q21yRmllbGQpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9ucygpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICB9Ki8KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSZXF1aXJlZCgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBCb29sZWFuIGlzUmVxdWlyZWQgPSBCb29sZWFuLkZBTFNFOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnNldFJlcXVpcmVkKGlzUmVxdWlyZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2Usb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5pc1JlcXVpcmVkKCkpOwotICAgICAgICBpc1JlcXVpcmVkID0gQm9vbGVhbi5UUlVFOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnNldFJlcXVpcmVkKGlzUmVxdWlyZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSxvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmlzUmVxdWlyZWQoKSk7Ci0gICAgfQotICAgIAotICAgLyogcHVibGljIHZvaWQgdGVzdF9yZWNvbmNpbGVBdHRyaWJ1dGVzKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUucmVjb25jaWxlQXR0cmlidXRlcygpOwotICAgIH0gKi8KLQotCi0gICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VqYkVNRlRlc3RCYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FamJFTUZUZXN0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQ2MDlmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VqYkVNRlRlc3RCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTQsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FamJFTUZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRWpiRU1GVGVzdEJhc2UgZXh0ZW5kcyBFamJFTUZUZXN0IHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEVqYkVNRlRlc3RCYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlRUpCKCk7Ci0KLQkJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKEVKQik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RUpCSmFyUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBkb250IHRlc3QgdGhlIGJhc2UgZnVuY3Rpb25zCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QxNEVKQkphclBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8JCSBkb250IHRlc3QgdGhlIGJhc2UgZnVuY3Rpb25zCi0JfQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VqYkZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FamJGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmJjMWFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VqYkZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTWV0aG9kQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkV4Y2x1ZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci0KLXB1YmxpYyBjbGFzcyBFamJGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgRWpiRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEVqYkZhY3RvcnlUZXN0LmNsYXNzKTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgdGVzdF9FamJGYWN0b3J5KCkgewotCi0gICAgICAgIEVqYkZhY3RvcnkgdG1wRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXRob2RFbGVtZW50KCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBhU2lnbmF0dXJlID0gIiI7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlTWV0aG9kRWxlbWVudChhU2lnbmF0dXJlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXRob2RFbGVtZW50RnJvbSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2QgYU1ldGhvZCA9ICBKYXZhUmVmRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAic2V0VHdvUGFyYW1NZXRob2QiOwotICAgICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIxID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgdHlwZTEgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgamF2YVBhcmFtZXRlcjEuc2V0RVR5cGUodHlwZTEpOwotICAgICAgICAKLSAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyMiA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0gICAgICAgIEphdmFIZWxwZXJzIHR5cGUyID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLnV0aWwuTGlzdCIpOwotICAgICAgICBqYXZhUGFyYW1ldGVyMi5zZXRFVHlwZSh0eXBlMik7Ci0gICAgICAgIAotICAgICAgICBhTWV0aG9kLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIGFNZXRob2QuZ2V0UGFyYW1ldGVycygpLmFkZChqYXZhUGFyYW1ldGVyMSk7Ci0gICAgICAgIGFNZXRob2QuZ2V0UGFyYW1ldGVycygpLmFkZChqYXZhUGFyYW1ldGVyMik7Ci0gICAgICAgIAotICAgICAgICBNZXRob2RFbGVtZW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZU1ldGhvZEVsZW1lbnRGcm9tKGFNZXRob2QpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1ldGhvZEVsZW1lbnRGcm9tXzIoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlTWV0aG9kRWxlbWVudEZyb20obWV0aG9kKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWV0aG9kUGVybWlzc2lvbigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZU1ldGhvZFBlcm1pc3Npb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRW50aXR5KCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVudGl0eSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVFbnRpdHkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ01QQXR0cmlidXRlKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDTVJGaWVsZCgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVJGaWVsZCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVDTVJGaWVsZCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFSkJSZWxhdGlvbigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJSZWxhdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVFSkJSZWxhdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUmVsYXRpb25zaGlwcygpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZWxhdGlvbnNoaXBzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZVJlbGF0aW9uc2hpcHMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFSkJKYXIoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCSmFyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUVKQkphcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVJvbGVTb3VyY2UoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUm9sZVNvdXJjZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVSb2xlU291cmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUXVlcnkoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUXVlcnkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVRdWVyeU1ldGhvZCgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBRdWVyeU1ldGhvZCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVRdWVyeU1ldGhvZCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQWN0aXZhdGlvbkNvbmZpZygpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBY3RpdmF0aW9uQ29uZmlnIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUFjdGl2YXRpb25Db25maWcoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXRob2RFbGVtZW50XzIoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kRWxlbWVudCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRXhjbHVkZUxpc3QoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRXhjbHVkZUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlRXhjbHVkZUxpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZXNzaW9uKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlc3Npb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1lc3NhZ2VEcml2ZW4oKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWVzc2FnZURyaXZlbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVNZXNzYWdlRHJpdmVuKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFSkJNZXRob2RDYXRlZ29yeSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJNZXRob2RDYXRlZ29yeSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVFSkJNZXRob2RDYXRlZ29yeSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VudGl0eVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VudGl0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhNTQ4Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FbnRpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotCi1wdWJsaWMgY2xhc3MgRW50aXR5VGVzdCBleHRlbmRzIEVqYkVNRlRlc3RCYXNlewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgRW50aXR5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBFbnRpdHkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbnRpdHkoKTsKLQl9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9FbnRpdHkoKSB7Ci0gICAgICAgIEVudGl0eSB0bXBFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcEVudGl0eSk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5zZXRVcCgpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbWFyeUtleU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgIAlpbml0KCk7Ci0gICAgCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAJCi0gICAgCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBERC5nZXRFSkJKYXIoKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHlCZWFuID0gbnVsbDsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IG51bGw7Ci0JCWZvciAoaW50IHg9MDsgeDwgZW50ZXJwcmlzZUJlYW5zLnNpemUoKTsgKyt4KSB7Ci0JCQliZWFuID0gKEVudGVycHJpc2VCZWFuKSBlbnRlcnByaXNlQmVhbnMuZ2V0KHgpOwotCQkJaWYgKGJlYW4uaXNFbnRpdHkoKSAmJiBiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJZW50aXR5QmVhbiA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChlbnRpdHlCZWFuICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gZW50aXR5QmVhbi5nZXRQcmltYXJ5S2V5TmFtZSgpOwotCQkJU3RyaW5nIHByaW1LZXlOYW1lID0gZW50aXR5QmVhbi5nZXRQcmltYXJ5S2V5KCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJYXNzZXJ0RXF1YWxzKG5hbWUscHJpbUtleU5hbWUpOwotCQkJCi0JCX0KLSAgICB9Ci0KLSAgICAKLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotICAgICAgICBFbnRpdHkgb2JqRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVudGl0eS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICB9Ki8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJpbWFyeUtleU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgCQotICAgIAlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gREQuZ2V0RUpCSmFyKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5QmVhbiA9IG51bGw7Ci0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSBudWxsOwotCQlmb3IgKGludCB4PTA7IHg8IGVudGVycHJpc2VCZWFucy5zaXplKCk7ICsreCkgewotCQkJYmVhbiA9IChFbnRlcnByaXNlQmVhbikgZW50ZXJwcmlzZUJlYW5zLmdldCh4KTsKLQkJCWlmIChiZWFuLmlzRW50aXR5KCkgJiYgYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCWVudGl0eUJlYW4gPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYmVhbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZW50aXR5QmVhbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGVudGl0eUJlYW4uZ2V0UHJpbWFyeUtleU5hbWUoKTsKLQkJCVN0cmluZyBuZXdOYW1lID0gIk5ld05hbWUiIDsKLQkJCWVudGl0eUJlYW4uc2V0UHJpbWFyeUtleU5hbWUobmV3TmFtZSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3TmFtZSxlbnRpdHlCZWFuLmdldFByaW1hcnlLZXlOYW1lKCkpOwotCQl9ICAgIAotICAgIH0KLQotICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2lzUmVlbnRyYW50KCkgewotCi0gICAgICAgIEVudGl0eSBvYmpFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRW50aXR5LmlzUmVlbnRyYW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSZWVudHJhbnQoKSB7Ci0KLSAgICAgICAgRW50aXR5IG9iakVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gbmV3UmVlbnRyYW50ID0gZmFsc2U7Ci0gICAgICAgIG9iakVudGl0eS5zZXRSZWVudHJhbnQobmV3UmVlbnRyYW50KTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF91bnNldFJlZW50cmFudCgpIHsKLQotICAgICAgICBFbnRpdHkgb2JqRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqRW50aXR5LnVuc2V0UmVlbnRyYW50KCk7Ci0gICAgfSAqLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0UmVlbnRyYW50KCkgewotCi0gICAgICAgIEVudGl0eSBvYmpFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRW50aXR5LmlzU2V0UmVlbnRyYW50KCk7Ci0gICAgfSAqLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByaW1hcnlLZXkoKSB7Ci0KLSAgICAgICAgRW50aXR5IG9iakVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEphdmFDbGFzcyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRW50aXR5LmdldFByaW1hcnlLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFByaW1hcnlLZXkoKSB7Ci0KLSAgICAgICAgRW50aXR5IG9iakVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEphdmFDbGFzcyBuZXdQcmltYXJ5S2V5ID0gbnVsbDsKLSAgICAgICAgb2JqRW50aXR5LnNldFByaW1hcnlLZXkobmV3UHJpbWFyeUtleSk7Ci0gICAgfSAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRW50aXR5VGVzdCgidGVzdF9zZXRQcmltYXJ5S2V5TmFtZSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRW50aXR5VGVzdCgidGVzdF9nZXRQcmltYXJ5S2V5TmFtZSIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L01ldGhvZEVsZW1lbnRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9NZXRob2RFbGVtZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWE4MWViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L01ldGhvZEVsZW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFRlc3QgZXh0ZW5kcyBFamJFTUZUZXN0QmFzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgU0VTU0lPTiA9MDsKLQlwcml2YXRlIGZpbmFsIGludCBFTlRJVFkgPSAxOwotCXByaXZhdGUgZmluYWwgaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWSA9MjsKLQkKLQkKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQkKLQl9Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCkuY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X01ldGhvZEVsZW1lbnQoKSB7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgdG1wTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wTWV0aG9kRWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9hZGRNZXRob2RQYXJhbXMoKSB7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBwYXJhbTEgPSAicGFyYW0xIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtMj0gInBhcmFtMiI7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gb2JqTWV0aG9kRWxlbWVudC5nZXRNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgcmV0VmFsdWUgPSBsaXN0LmNvbnRhaW5zKHBhcmFtMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGx5WmVyb1BhcmFtcygpIHsKLSAgICAJTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtMSA9ICJwYXJhbTEiOwotICAgICAgICBTdHJpbmcgcGFyYW0yPSAicGFyYW0yIjsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgICBMaXN0IGxpc3QgPSBvYmpNZXRob2RFbGVtZW50LmdldE1ldGhvZFBhcmFtcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdC5zaXplKCk9PTIsIHRydWUpIDsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hcHBseVplcm9QYXJhbXMoKTsKLSAgICAgICAgbGlzdCA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0LnNpemUoKT09MCwgdHJ1ZSkgOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsU2lnbmF0dXJlKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudDEgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50MyA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50MS5zZXROYW1lKCJuYW1lIik7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLnNldE5hbWUoIm5hbWUiKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDMuc2V0TmFtZSgibmFtZSIpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBhcmFtMSA9ICJwYXJhbTEiOwotICAgICAgICBTdHJpbmcgcGFyYW0yPSAicGFyYW0yIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtMyA9ICJwYXJhbTMiOwotICAgICAgICBTdHJpbmcgcGFyYW00PSAicGFyYW00IjsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQxLmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50MS5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50Mi5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQzLmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50My5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQxLnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQzLnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudDEuZXF1YWxTaWduYXR1cmUob2JqTWV0aG9kRWxlbWVudDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudDIuZXF1YWxTaWduYXR1cmUob2JqTWV0aG9kRWxlbWVudDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50My5zZXROYW1lKCJuYW1lRGlmZiIpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQyLmVxdWFsU2lnbmF0dXJlKG9iak1ldGhvZEVsZW1lbnQzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLmFkZE1ldGhvZFBhcmFtcyhwYXJhbTMpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQxLmVxdWFsU2lnbmF0dXJlKG9iak1ldGhvZEVsZW1lbnQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQzLnNldE5hbWUoIm5hbWUiKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50MS5lcXVhbFNpZ25hdHVyZShvYmpNZXRob2RFbGVtZW50Myk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQzLnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuSE9NRV9MSVRFUkFMKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50MS5lcXVhbFNpZ25hdHVyZShvYmpNZXRob2RFbGVtZW50Myk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RQYXJhbXMoKSB7Ci0KLSAgICAJTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtMSA9ICJwYXJhbTEiOwotICAgICAgICBTdHJpbmcgcGFyYW0yPSAicGFyYW0yIjsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgICBMaXN0IGxpc3QgPSBvYmpNZXRob2RFbGVtZW50LmdldE1ldGhvZFBhcmFtcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdC5zaXplKCk9PTIsIHRydWUpIDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3QuY29udGFpbnMocGFyYW0xKSx0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3QuY29udGFpbnMocGFyYW0yKSx0cnVlKTsKLSAgICB9Ci0KLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2lnbmF0dXJlKCkgewotCi0gICAgCU1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgCVN0cmluZyBuYW1lID0gInRlc3QiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldE5hbWUobmFtZSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcGFyYW0xID0gInBhcmFtMSI7Ci0gICAgICAgIFN0cmluZyBwYXJhbTI9ICJwYXJhbTIiOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSBuYW1lICsgIigiICsgcGFyYW0xICsgIiwiICsgcGFyYW0yICsgIikiOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFNpZ25hdHVyZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2lnbmF0dXJlLHJldFZhbHVlKTsKLSAgICAgICAgCi0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGVKYXZhQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gREQuZ2V0RUpCSmFyKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0gICAgCUVudGVycHJpc2VCZWFuIGViID0gKEVudGVycHJpc2VCZWFuKWVudGVycHJpc2VCZWFucy5nZXQoMCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0RW50ZXJwcmlzZUJlYW4oZWIpOwotICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICBpZiAoZWIuaGFzUmVtb3RlQ2xpZW50KCkpIHsKLSAgICAgICAgCW9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUwpOwotICAgICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFR5cGVKYXZhQ2xhc3MoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxlYi5nZXRIb21lSW50ZXJmYWNlKCkpOwotICAgICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlJFTU9URV9MSVRFUkFMKTsKLSAgICAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRUeXBlSmF2YUNsYXNzKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZWIuZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gCi0gICAgICAgIGlmIChlYi5oYXNMb2NhbENsaWVudCgpKXsKLSAgICAgICAgCW9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUwpOwotICAgICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFR5cGVKYXZhQ2xhc3MoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxlYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSk7Ci0gICAgICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0gICAgICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0VHlwZUphdmFDbGFzcygpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGViLmdldExvY2FsSW50ZXJmYWNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gCi0gICAgICAgIGlmIChlYi5pc01lc3NhZ2VEcml2ZW4oKSkgewotICAgICAgICAJb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotICAgICAgICAJcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFR5cGVKYXZhQ2xhc3MoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxlYi5nZXRFamJDbGFzcygpKTsKLSAgICAgICAgfQotICAKLSAgICB9Ci0gICAgCi0gICAKLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RzKCkgewotICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9zdFNwZWNpZmljKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgYU1ldGhvZEVsZW1lbnQgPSBudWxsOwotICAgICAgICBKYXZhQ2xhc3MgYUNsYXNzID0gbnVsbDsKLSAgICAgICAgTWV0aG9kRWxlbWVudCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRNb3N0U3BlY2lmaWMoYU1ldGhvZEVsZW1lbnQsIGFDbGFzcyk7Ci0gICAgfSovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9oYXNNZXRob2RQYXJhbXMoKSB7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50Lmhhc01ldGhvZFBhcmFtcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICBTdHJpbmcgcGFyYW0xID0gInBhcmFtMSI7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5oYXNNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICBTdHJpbmcgcGFyYW0yID0gInBhcmFtMiI7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMik7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5oYXNNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoKSB7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSAic2V0VHdvUGFyYW1NZXRob2QoamF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuTGlzdCkiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmluaXRpYWxpemVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZSk7Ci0gICAgICAgIExpc3QgbGlzdCA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0LnNpemUoKT09MiwgdHJ1ZSkgOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICJzZXRUd29QYXJhbU1ldGhvZCI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0LmNvbnRhaW5zKCJqYXZhLmxhbmcuU3RyaW5nIiksdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0LmNvbnRhaW5zKCJqYXZhLnV0aWwuTGlzdCIpLHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2JqTWV0aG9kRWxlbWVudC5nZXROYW1lKCksICJzZXRUd29QYXJhbU1ldGhvZCIpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRGVmYXVsdCgpIHsKLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXROYW1lKCJ0ZXN0Iik7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzRGVmYXVsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldE5hbWUoSmF2YUNsYXNzLkRFRkFVTFRfTUVUSE9EX05BTUUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNEZWZhdWx0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0VxdWl2YWxlbnQoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50MSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudDIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uMSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbjIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50MS5zZXRFbnRlcnByaXNlQmVhbihzZXNzaW9uMSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLnNldEVudGVycHJpc2VCZWFuKHNlc3Npb24xKTsKLSAgICAgICAgU3RyaW5nIHNpZ25hdHVyZTEgPSAic2V0VHdvUGFyYW1NZXRob2QoamF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuTGlzdCkiOwotICAgICAgICBTdHJpbmcgc2lnbmF0dXJlMiA9ICJzZXRUd29QYXJhbU1ldGhvZDIoamF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuTGlzdCkiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50MS5pbml0aWFsaXplRnJvbVNpZ25hdHVyZShzaWduYXR1cmUxKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDIuaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoc2lnbmF0dXJlMSk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50MS5pc0VxdWl2YWxlbnQob2JqTWV0aG9kRWxlbWVudDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLmluaXRpYWxpemVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZTIpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQxLmlzRXF1aXZhbGVudChvYmpNZXRob2RFbGVtZW50Mik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50Mi5pbml0aWFsaXplRnJvbVNpZ25hdHVyZShzaWduYXR1cmUxKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDIuc2V0RW50ZXJwcmlzZUJlYW4oc2Vzc2lvbjIpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQxLmlzRXF1aXZhbGVudChvYmpNZXRob2RFbGVtZW50Mik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0hvbWUoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkhPTUVfTElURVJBTCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzSG9tZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUwpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNIb21lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNSZW1vdGUoKSB7Ci0gICAgCSBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlJFTU9URV9MSVRFUkFMKTsKLSAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc1JlbW90ZSgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0hPTUVfTElURVJBTCk7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNSZW1vdGUoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1Vuc3BlY2lmaWVkKCkgewotICAgIAkgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKTsKLSAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc1Vuc3BlY2lmaWVkKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfSE9NRV9MSVRFUkFMKTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc1Vuc3BlY2lmaWVkKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTG9jYWxIb21lKCkgewotCi0gICAgCSBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0hPTUVfTElURVJBTCApOwotICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzTG9jYWxIb21lKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTCk7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNMb2NhbEhvbWUoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0xvY2FsKCkgewotICAgIAkgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9MSVRFUkFMICk7Ci0gICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNMb2NhbCgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzTG9jYWwoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1ZhbGlkKCkgewotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc1ZhbGlkKCk7Ci0gICAgfQotCi0gIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfbmFtZUFuZFBhcmFtc0VxdWFscygpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2QgYU1ldGhvZCA9ICBKYXZhUmVmRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZCgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICJzZXRUd29QYXJhbU1ldGhvZCI7Ci0gICAgICAgIFN0cmluZyBwYXJhbTEgPSAiamF2YS5sYW5nLlN0cmluZyI7Ci0gICAgICAgIFN0cmluZyBwYXJhbTIgPSAiamF2YS51dGlsLkxpc3QiOwotICAgICAgICAKLSAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyMSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0gICAgICAgIEphdmFIZWxwZXJzIHR5cGUxID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgIGphdmFQYXJhbWV0ZXIxLnNldEVUeXBlKHR5cGUxKTsKLSAgICAgICAgCi0gICAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcjIgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotICAgICAgICBKYXZhSGVscGVycyB0eXBlMiA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS51dGlsLkxpc3QiKTsKLSAgICAgICAgamF2YVBhcmFtZXRlcjIuc2V0RVR5cGUodHlwZTIpOwotICAgICAgICAKLSAgICAgICAgYU1ldGhvZC5zZXROYW1lKG5hbWUpOwotICAgICAgICBhTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQoamF2YVBhcmFtZXRlcjEpOwotICAgICAgICBhTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQoamF2YVBhcmFtZXRlcjIpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXROYW1lKG5hbWUpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgIAotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5uYW1lQW5kUGFyYW1zRXF1YWxzKGFNZXRob2QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZTIgPSAic2V0VHdvUGFyYW1NZXRob2QyIjsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXROYW1lKG5hbWUyKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50Lm5hbWVBbmRQYXJhbXNFcXVhbHMoYU1ldGhvZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldE5hbWUobmFtZSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbTMgPSAiamF2YS51dGlsLkxpc3QiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTMpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQubmFtZUFuZFBhcmFtc0VxdWFscyhhTWV0aG9kKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVNZXRob2RQYXJhbXMoKSB7Ci0KLSAgICAJIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBTdHJpbmcgcGFyYW0xID0gInBhcmFtMSI7Ci0gICAgICAgICBTdHJpbmcgcGFyYW0yPSAicGFyYW0yIjsKLSAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgICAgTGlzdCBsaXN0ID0gb2JqTWV0aG9kRWxlbWVudC5nZXRNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgIHJldFZhbHVlID0gbGlzdC5jb250YWlucyhwYXJhbTEpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5yZW1vdmVNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgIGxpc3QgPSBvYmpNZXRob2RFbGVtZW50LmdldE1ldGhvZFBhcmFtcygpOwotICAgICAgICAgcmV0VmFsdWUgPSBsaXN0LmNvbnRhaW5zKHBhcmFtMSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF9yZXByZXNlbnRzKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZCBhTWV0aG9kID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQucmVwcmVzZW50cyhhTWV0aG9kKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElkVG9SZWFkYWJsZVN0cmluZygpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldElkVG9SZWFkYWJsZVN0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5pcXVlbHlJZGVudGlmaWVzKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZCBhTWV0aG9kID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQudW5pcXVlbHlJZGVudGlmaWVzKGFNZXRob2QpOwotICAgIH0gKi8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X3NldE5hbWUoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld05hbWUgPSAiIjsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXROYW1lKG5ld05hbWUpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFBhcm1zKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0UGFybXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFBhcm1zKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdQYXJtcyA9ICIiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFBhcm1zKG5ld1Bhcm1zKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnRLaW5kIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFR5cGUoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kRWxlbWVudEtpbmQgbmV3VHlwZSA9IG51bGw7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShuZXdUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0VHlwZSgpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnVuc2V0VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTZXRUeXBlKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzU2V0VHlwZSgpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRFbnRlcnByaXNlQmVhbigpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFbnRlcnByaXNlQmVhbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRFbnRlcnByaXNlQmVhbigpOwotICAgIH0KLQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEVudGVycHJpc2VCZWFuKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVudGVycHJpc2VCZWFuIG5ld0VudGVycHJpc2VCZWFuID0gbnVsbDsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRFbnRlcnByaXNlQmVhbihuZXdFbnRlcnByaXNlQmVhbik7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldERlc2NyaXB0aW9ucygpOwotICAgIH0qLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoTWV0aG9kRWxlbWVudFRlc3QuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvTWV0aG9kUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L01ldGhvZFBlcm1pc3Npb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzQ1NzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvTWV0aG9kUGVybWlzc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFamJGYWN0b3J5IEVKQkZBQ1RPUlkgPSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tbW9uRmFjdG9yeSBDT01NT05GQUNUT1JZID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotCXByaXZhdGUgTWV0aG9kUGVybWlzc2lvbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEVKQkZBQ1RPUlkuY3JlYXRlTWV0aG9kUGVybWlzc2lvbigpOwotCX0KLQkKLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X01ldGhvZFBlcm1pc3Npb24oKSB7Ci0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gdG1wTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wTWV0aG9kUGVybWlzc2lvbik7Ci0gICAgfQotCi0gICAvKnB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kRWxlbWVudHMoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRW50ZXJwcmlzZUJlYW4gYW5FSkIgPSBudWxsOwotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmdldE1ldGhvZEVsZW1lbnRzKGFuRUpCKTsKLSAgICB9Ki8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VjdXJpdHlSb2xlKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGU9IENPTU1PTkZBQ1RPUlkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JCVN0cmluZyBzZWN1cml0eVJvbGVOYW1lID0gInRlc3RSb2xlIjsKLQkJc2VjdXJpdHlSb2xlLnNldFJvbGVOYW1lKHNlY3VyaXR5Um9sZU5hbWUpOwotCQlvYmpNZXRob2RQZXJtaXNzaW9uLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZSk7Ci0JCQotICAgICAgICBTZWN1cml0eVJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uZ2V0U2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZU5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VjdXJpdHlSb2xlLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc1NlY3VyaXR5Um9sZSgpIHsKLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZT0gQ09NTU9ORkFDVE9SWS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQkJU3RyaW5nIHNlY3VyaXR5Um9sZU5hbWUgPSAidGVzdFJvbGUiOwotCQlzZWN1cml0eVJvbGUuc2V0Um9sZU5hbWUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0JCW9iak1ldGhvZFBlcm1pc3Npb24uZ2V0Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uaGFzU2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGUyPSBDT01NT05GQUNUT1JZLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uaGFzU2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZTIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc1NlY3VyaXR5Um9sZV8yKCkgewotCi0gICAgCU1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGU9IENPTU1PTkZBQ1RPUlkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JCVN0cmluZyBzZWN1cml0eVJvbGVOYW1lID0gInRlc3RSb2xlIjsKLQkJc2VjdXJpdHlSb2xlLnNldFJvbGVOYW1lKHNlY3VyaXR5Um9sZU5hbWUpOwotCQlvYmpNZXRob2RQZXJtaXNzaW9uLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZSk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmhhc1NlY3VyaXR5Um9sZShzZWN1cml0eVJvbGVOYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCB0cnVlKTsKLSAgICAgICAgU3RyaW5nIHNlY3VyaXR5Um9sZU5hbWVEb2VzTm90RXhpc3QgPSAidGVzdFJvbGVEb2VzTm90RXhpc3QiOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uaGFzU2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZU5hbWVEb2VzTm90RXhpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRXF1aXZhbGVudCgpIHsKLQotICAgIAlNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24xID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAJTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uMiA9IGdldEluc3RhbmNlKCk7Ci0gICAgCQotICAgICAgICBTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlMT0gQ09NTU9ORkFDVE9SWS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLSAgICAgICAgc2VjdXJpdHlSb2xlMS5zZXRSb2xlTmFtZSgidGVzdFJvbGUxIik7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGUyPSBDT01NT05GQUNUT1JZLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotICAgICAgICBzZWN1cml0eVJvbGUyLnNldFJvbGVOYW1lKCJ0ZXN0Um9sZTIiKTsKLSAgICAgICAgU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZTM9IENPTU1PTkZBQ1RPUlkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0gICAgICAgIHNlY3VyaXR5Um9sZTMuc2V0Um9sZU5hbWUoInRlc3RSb2xlMyIpOwotICAgICAgICAKLQkJCi0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24xLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZTEpOwotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uMS5nZXRSb2xlcygpLmFkZChzZWN1cml0eVJvbGUyKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24yLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZTEpOwotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uMi5nZXRSb2xlcygpLmFkZChzZWN1cml0eVJvbGUyKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbjEuaXNFcXVpdmFsZW50KG9iak1ldGhvZFBlcm1pc3Npb24yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24xLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZTMpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24xLmlzRXF1aXZhbGVudChvYmpNZXRob2RQZXJtaXNzaW9uMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgfQotCi0gLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rlc2NyaXB0aW9uID0gIiI7Ci0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24uc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotICAgIH0qLwotCi0gIC8qIHB1YmxpYyB2b2lkIHRlc3RfaXNVbmNoZWNrZWQoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uaXNVbmNoZWNrZWQoKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9zZXRVbmNoZWNrZWQoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiBuZXdVbmNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgb2JqTWV0aG9kUGVybWlzc2lvbi5zZXRVbmNoZWNrZWQobmV3VW5jaGVja2VkKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF91bnNldFVuY2hlY2tlZCgpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uLnVuc2V0VW5jaGVja2VkKCk7Ci0gICAgfSovCi0KLSAgICAvKnB1YmxpYyB2b2lkIHRlc3RfaXNTZXRVbmNoZWNrZWQoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uaXNTZXRVbmNoZWNrZWQoKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IgPSBudWxsOwotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uLnNldEFzc2VtYmx5RGVzY3JpcHRvcihuZXdBc3NlbWJseURlc2NyaXB0b3IpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFJvbGVzKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmdldFJvbGVzKCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kRWxlbWVudHNfMigpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5nZXRNZXRob2RFbGVtZW50cygpOwotICAgIH0qLwotCi0gIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmdldERlc2NyaXB0aW9ucygpOwotICAgIH0qLyAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoTWV0aG9kUGVybWlzc2lvblRlc3QuY2xhc3MpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9NZXRob2RUcmFuc2FjdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L01ldGhvZFRyYW5zYWN0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2RkOThkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L01ldGhvZFRyYW5zYWN0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXRob2RUcmFuc2FjdGlvblRlc3QgZXh0ZW5kcyBFamJFTUZUZXN0QmFzZSB7Ci0KLSAgICAvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBNZXRob2RUcmFuc2FjdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF9NZXRob2RUcmFuc2FjdGlvbigpIHsKLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gdG1wTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcE1ldGhvZFRyYW5zYWN0aW9uKTsKLSAgICB9ICAgCi0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb257Ci0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoYXNzZW1ibHlEZXNjcmlwdG9yKTsKLQkJTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBERC5nZXRFSkJKYXIoKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJRW50ZXJwcmlzZUJlYW4gZWIxID0gKEVudGVycHJpc2VCZWFuKWVudGVycHJpc2VCZWFucy5nZXQoMCk7Ci0JCS8vIGNyZWF0ZSBhIG1ldGhvZCB0cmFuc2FjdGlvbgotCQlNZXRob2RUcmFuc2FjdGlvbiBtZXRob2RUcmFuc2FjdGlvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotCQlMaXN0IG1ldGhvZFRyYW5zYWN0aW9ucyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKTsKLQkJbWV0aG9kVHJhbnNhY3Rpb25zLmFkZChtZXRob2RUcmFuc2FjdGlvbik7Ci0JCS8vIGNyZWF0ZSBhIG1ldGhvZCBlbGVtZW50Ci0JCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0JCW1ldGhvZEVsZW1lbnQuc2V0RW50ZXJwcmlzZUJlYW4oZWIxKTsKLQkJbWV0aG9kVHJhbnNhY3Rpb24uZ2V0TWV0aG9kRWxlbWVudHMoKS5hZGQobWV0aG9kRWxlbWVudCk7Ci0JCS8vIGdldCB0aGUgbWV0aG9kIGVsZW1lbnQgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4KLQkJTGlzdCBtZXRob2RFbGVtZW50cyA9IG1ldGhvZFRyYW5zYWN0aW9uLmdldE1ldGhvZEVsZW1lbnRzKGViMSk7Ci0JCWFzc2VydEVxdWFscyhtZXRob2RFbGVtZW50cy5jb250YWlucyhtZXRob2RFbGVtZW50KSwgdHJ1ZSk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqICAKLSAgICAgKiBbaXNzdWUgOiBTQSAtIGdldE1vc3RTcGVjaWZpY01ldGhvZEVsZW1lbnQoKSAtIGRvZXMgaXQgbmVlZCB0byBiZSBhbiBBUEkgYXMgaXQgY2FsbHMKLSAgICAgKiAgdG8gdGhlIHN0YXRpYyBtZW1iZXIgb2YgTWV0aG9kRWxlbWVudEltcGwgXQotICAgICAqCi0gICAgICovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9zdFNwZWNpZmljTWV0aG9kRWxlbWVudCgpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIE1ldGhvZCBhTWV0aG9kID0gbnVsbDsKLSAgICAgICAgTWV0aG9kRWxlbWVudCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kVHJhbnNhY3Rpb24KLSAgICAgICAgICAgICAgICAuZ2V0TW9zdFNwZWNpZmljTWV0aG9kRWxlbWVudChhTWV0aG9kKTsKLSAgICB9ICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRXF1aXZhbGVudCgpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbjEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24yID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0KLSAgICAgICAgb2JqTWV0aG9kVHJhbnNhY3Rpb24xLnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5TVVBQT1JUU19MSVRFUkFMKTsKLSAgICAgICAgb2JqTWV0aG9kVHJhbnNhY3Rpb24yLnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5TVVBQT1JUU19MSVRFUkFMKTsKLSAgICAgCi0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBvYmpNZXRob2RUcmFuc2FjdGlvbjEuaXNFcXVpdmFsZW50KG9iak1ldGhvZFRyYW5zYWN0aW9uMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgb2JqTWV0aG9kVHJhbnNhY3Rpb24yLnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5SRVFVSVJFRF9MSVRFUkFMKTsKLSAgICAgICAgCi0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kVHJhbnNhY3Rpb24xLmlzRXF1aXZhbGVudChvYmpNZXRob2RUcmFuc2FjdGlvbjIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kVHJhbnNhY3Rpb24uZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIG5ld1RyYW5zYWN0aW9uQXR0cmlidXRlID0gbnVsbDsKLSAgICAgICAgb2JqTWV0aG9kVHJhbnNhY3Rpb24KLSAgICAgICAgICAgICAgICAuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUobmV3VHJhbnNhY3Rpb25BdHRyaWJ1dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5zZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIG9iak1ldGhvZFRyYW5zYWN0aW9uLnVuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLSAgICB9IAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1NldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFRyYW5zYWN0aW9uLmlzU2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLSAgICB9Ci0qLwotIC8qICAgcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFRyYW5zYWN0aW9uLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpNZXRob2RUcmFuc2FjdGlvbi5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfSovCi0KLSAvKiAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RUcmFuc2FjdGlvbi5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IgPSBudWxsOwotICAgICAgICBvYmpNZXRob2RUcmFuc2FjdGlvbi5zZXRBc3NlbWJseURlc2NyaXB0b3IobmV3QXNzZW1ibHlEZXNjcmlwdG9yKTsKLSAgICB9ICovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kRWxlbWVudHNfMigpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RUcmFuc2FjdGlvbi5nZXRNZXRob2RFbGVtZW50cygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFRyYW5zYWN0aW9uLmdldERlc2NyaXB0aW9ucygpOwotICAgIH0gKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IE1ldGhvZFRyYW5zYWN0aW9uVGVzdCgidGVzdF9pc0VxdWl2YWxlbnQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IE1ldGhvZFRyYW5zYWN0aW9uVGVzdCgidGVzdF9nZXRNZXRob2RFbGVtZW50cyIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLSAgIAotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9RdWVyeU1ldGhvZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L1F1ZXJ5TWV0aG9kVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2E2ZmZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L1F1ZXJ5TWV0aG9kVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5TWV0aG9kOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlNZXRob2RUZXN0IGV4dGVuZHMgRWpiRU1GVGVzdEJhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgUXVlcnlNZXRob2RUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLSAgIAotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRRdWVyeSgpIHsKLQotICAgICAgICBRdWVyeU1ldGhvZCBvYmpRdWVyeU1ldGhvZCA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5TWV0aG9kKCk7Ci0gICAgICAgIFF1ZXJ5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeU1ldGhvZC5nZXRRdWVyeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UXVlcnkoKSB7Ci0KLSAgICAgICAgUXVlcnlNZXRob2Qgb2JqUXVlcnlNZXRob2QgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeU1ldGhvZCgpOwotICAgICAgICBRdWVyeSBuZXdRdWVyeSA9IG51bGw7Ci0gICAgICAgIG9ialF1ZXJ5TWV0aG9kLnNldFF1ZXJ5KG5ld1F1ZXJ5KTsKLSAgICB9ICovCi0gICAgCi0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudFR5cGVKYXZhQ2xhc3NlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlpbml0KCk7Ci0JCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJCi0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBERC5nZXRFSkJKYXIoKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHlCZWFuID0gbnVsbDsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IG51bGw7Ci0JCWZvciAoaW50IHg9MDsgeDwgZW50ZXJwcmlzZUJlYW5zLnNpemUoKTsgKyt4KSB7Ci0JCQliZWFuID0gKEVudGVycHJpc2VCZWFuKSBlbnRlcnByaXNlQmVhbnMuZ2V0KHgpOwotCQkJaWYgKGJlYW4uaXNFbnRpdHkoKSAmJiBiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJZW50aXR5QmVhbiA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5QmVhbik7Ci0JCVF1ZXJ5TWV0aG9kIG9ialF1ZXJ5TWV0aG9kID1nZXRFamJGYWN0b3J5KCkuY3JlYXRlUXVlcnlNZXRob2QoKTsKLQkJb2JqUXVlcnlNZXRob2Quc2V0TmFtZShRdWVyeU1ldGhvZC5TRUxFQ1RfUFJFRklYKyJUZXN0Iik7Ci0JCW9ialF1ZXJ5TWV0aG9kLnNldEVudGVycHJpc2VCZWFuKGVudGl0eUJlYW4pOwotCQlKYXZhQ2xhc3NbXSByZXRWYWx1ZSA9IG9ialF1ZXJ5TWV0aG9kLmdldENsaWVudFR5cGVKYXZhQ2xhc3NlcygpOwotCQlhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmxlbmd0aD09MSx0cnVlICk7Ci0JCWFzc2VydEVxdWFscyhyZXRWYWx1ZVswXSxlbnRpdHlCZWFuLmdldEVqYkNsYXNzKCkpOwotCQkKLQkJb2JqUXVlcnlNZXRob2Quc2V0TmFtZShRdWVyeU1ldGhvZC5GSU5EX1BSRUZJWCsiVGVzdCIpOwotCQkKLQkJaWYgKGVudGl0eUJlYW4uaGFzTG9jYWxDbGllbnQoKSAmJiAhZW50aXR5QmVhbi5oYXNSZW1vdGVDbGllbnQoKSkgewotCQkJcmV0VmFsdWUgPSBvYmpRdWVyeU1ldGhvZC5nZXRDbGllbnRUeXBlSmF2YUNsYXNzZXMoKTsKLQkJCWFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotCQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmxlbmd0aD09MSx0cnVlICk7Ci0JCQlhc3NlcnRFcXVhbHMocmV0VmFsdWVbMF0sZW50aXR5QmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSk7Ci0JCX0JCi0JCWlmIChlbnRpdHlCZWFuLmhhc1JlbW90ZUNsaWVudCgpICYmICFlbnRpdHlCZWFuLmhhc0xvY2FsQ2xpZW50KCkpIHsKLQkJCXJldFZhbHVlID0gb2JqUXVlcnlNZXRob2QuZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzKCk7Ci0JCQlhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLQkJCWFzc2VydEVxdWFscyhyZXRWYWx1ZS5sZW5ndGg9PTEsdHJ1ZSApOwotCQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlWzBdLGVudGl0eUJlYW4uZ2V0SG9tZUludGVyZmFjZSgpKTsKLQkJfQotCQlpZiAoZW50aXR5QmVhbi5oYXNSZW1vdGVDbGllbnQoKSAmJiBlbnRpdHlCZWFuLmhhc0xvY2FsQ2xpZW50KCkpIHsKLQkJCXJldFZhbHVlID0gb2JqUXVlcnlNZXRob2QuZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzKCk7Ci0JCQlhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLQkJCWFzc2VydEVxdWFscyhyZXRWYWx1ZS5sZW5ndGg9PTIsdHJ1ZSApOwotCQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlWzBdLGVudGl0eUJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlWzFdLGVudGl0eUJlYW4uZ2V0SG9tZUludGVyZmFjZSgpKTsKLQkJfSAgCi0JfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgUXVlcnlNZXRob2RUZXN0KCJ0ZXN0X2dldENsaWVudFR5cGVKYXZhQ2xhc3NlcyIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0JCQotCQkKLQkKLQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvUXVlcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9RdWVyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYyZDY0Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9RdWVyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJldHVyblR5cGVNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdF9RdWVyeSgpIHsKLSAgICAgICAgUXVlcnkgdG1wUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcFF1ZXJ5KTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShRdWVyeVRlc3QuY2xhc3MpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNMb2NhbFJlc3VsdE1hcHBpbmcoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBvYmpRdWVyeS5zZXRSZXR1cm5UeXBlTWFwcGluZyhSZXR1cm5UeXBlTWFwcGluZy5MT0NBTF9MSVRFUkFMKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9ialF1ZXJ5LmlzTG9jYWxSZXN1bHRNYXBwaW5nKCksdHJ1ZSk7Ci0gICAgICAgIG9ialF1ZXJ5LnNldFJldHVyblR5cGVNYXBwaW5nKFJldHVyblR5cGVNYXBwaW5nLlJFTU9URV9MSVRFUkFMKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9ialF1ZXJ5LmlzTG9jYWxSZXN1bHRNYXBwaW5nKCksZmFsc2UpOwotICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNSZW1vdGVSZXN1bHRNYXBwaW5nKCkgewotCi0gICAgCSBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgICBvYmpRdWVyeS5zZXRSZXR1cm5UeXBlTWFwcGluZyhSZXR1cm5UeXBlTWFwcGluZy5SRU1PVEVfTElURVJBTCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMob2JqUXVlcnkuaXNMb2NhbFJlc3VsdE1hcHBpbmcoKSxmYWxzZSk7Ci0gICAgICAgICBvYmpRdWVyeS5zZXRSZXR1cm5UeXBlTWFwcGluZyhSZXR1cm5UeXBlTWFwcGluZy5MT0NBTF9MSVRFUkFMKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhvYmpRdWVyeS5pc0xvY2FsUmVzdWx0TWFwcGluZygpLHRydWUpOwotICAgICAKLSAgICB9Ci0KLSAvKiAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeS5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqUXVlcnkuc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RWpiUUwoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeS5nZXRFamJRTCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RWpiUUwoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBTdHJpbmcgbmV3RWpiUUwgPSAiIjsKLSAgICAgICAgb2JqUXVlcnkuc2V0RWpiUUwobmV3RWpiUUwpOwotICAgIH0gKi8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRSZXR1cm5UeXBlTWFwcGluZygpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIFJldHVyblR5cGVNYXBwaW5nIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeS5nZXRSZXR1cm5UeXBlTWFwcGluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmV0dXJuVHlwZU1hcHBpbmcoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBSZXR1cm5UeXBlTWFwcGluZyBuZXdSZXR1cm5UeXBlTWFwcGluZyA9IG51bGw7Ci0gICAgICAgIG9ialF1ZXJ5LnNldFJldHVyblR5cGVNYXBwaW5nKG5ld1JldHVyblR5cGVNYXBwaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0UmV0dXJuVHlwZU1hcHBpbmcoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBvYmpRdWVyeS51bnNldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1NldFJldHVyblR5cGVNYXBwaW5nKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9ialF1ZXJ5LmlzU2V0UmV0dXJuVHlwZU1hcHBpbmcoKTsKLSAgICB9Ki8KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF9nZXRRdWVyeU1ldGhvZCgpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIFF1ZXJ5TWV0aG9kIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeS5nZXRRdWVyeU1ldGhvZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UXVlcnlNZXRob2QoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBRdWVyeU1ldGhvZCBuZXdRdWVyeU1ldGhvZCA9IG51bGw7Ci0gICAgICAgIG9ialF1ZXJ5LnNldFF1ZXJ5TWV0aG9kKG5ld1F1ZXJ5TWV0aG9kKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRFbnRpdHkoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeS5nZXRFbnRpdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEVudGl0eSgpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgbmV3RW50aXR5ID0gbnVsbDsKLSAgICAgICAgb2JqUXVlcnkuc2V0RW50aXR5KG5ld0VudGl0eSk7Ci0gICAgfSovCi0KLSAgICAvKnB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialF1ZXJ5LmdldERlc2NyaXB0aW9ucygpOwotICAgIH0qLwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvU2Vzc2lvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L1Nlc3Npb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNzdmZDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvU2Vzc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLQotcHVibGljIGNsYXNzIFNlc3Npb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFNlc3Npb25UZXN0LmNsYXNzKTsKLQl9Ci0gCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBUcmFuc2FjdGlvblR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialNlc3Npb24uZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgVHJhbnNhY3Rpb25UeXBlIG5ld1RyYW5zYWN0aW9uVHlwZSA9IG51bGw7Ci0gICAgICAgIG9ialNlc3Npb24uc2V0VHJhbnNhY3Rpb25UeXBlKG5ld1RyYW5zYWN0aW9uVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF91bnNldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpTZXNzaW9uLnVuc2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1NldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqU2Vzc2lvbi5pc1NldFRyYW5zYWN0aW9uVHlwZSgpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlc3Npb25UeXBlKCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIFNlc3Npb25UeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpTZXNzaW9uLmdldFNlc3Npb25UeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRTZXNzaW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBTZXNzaW9uVHlwZSBuZXdTZXNzaW9uVHlwZSA9IG51bGw7Ci0gICAgICAgIG9ialNlc3Npb24uc2V0U2Vzc2lvblR5cGUobmV3U2Vzc2lvblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5zZXRTZXNzaW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpTZXNzaW9uLnVuc2V0U2Vzc2lvblR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0U2Vzc2lvblR5cGUoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9ialNlc3Npb24uaXNTZXRTZXNzaW9uVHlwZSgpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlcnZpY2VFbmRwb2ludCgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialNlc3Npb24uZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNlcnZpY2VFbmRwb2ludCgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBKYXZhQ2xhc3MgbmV3U2VydmljZUVuZHBvaW50ID0gbnVsbDsKLSAgICAgICAgb2JqU2Vzc2lvbi5zZXRTZXJ2aWNlRW5kcG9pbnQobmV3U2VydmljZUVuZHBvaW50KTsKLSAgICB9Ki8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNlcnZpY2VFbmRwb2ludE5hbWUoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlRW5kcG9pbnROYW1lID0gIlNlc3Npb25FbmRQb2ludDEiOwotICAgICAgICBvYmpTZXNzaW9uLnNldFNlcnZpY2VFbmRwb2ludE5hbWUoc2VydmljZUVuZHBvaW50TmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlRW5kcG9pbnROYW1lLG9ialNlc3Npb24uZ2V0U2VydmljZUVuZHBvaW50TmFtZSgpKTsKLSAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc1NlcnZpY2VFbmRwb2ludCgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2JqU2Vzc2lvbi5oYXNTZXJ2aWNlRW5kcG9pbnQoKSxmYWxzZSk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VFbmRwb2ludE5hbWUgPSAiU2Vzc2lvbkVuZFBvaW50MSI7Ci0gICAgICAgIG9ialNlc3Npb24uc2V0U2VydmljZUVuZHBvaW50TmFtZShzZXJ2aWNlRW5kcG9pbnROYW1lKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpTZXNzaW9uLmhhc1NlcnZpY2VFbmRwb2ludCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2JqU2Vzc2lvbi5oYXNTZXJ2aWNlRW5kcG9pbnQoKSx0cnVlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZXJ2aWNlRW5kcG9pbnROYW1lKCkgewotCi0JICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgU3RyaW5nIHNlcnZpY2VFbmRwb2ludE5hbWUgPSAiU2Vzc2lvbkVuZFBvaW50MSI7Ci0gICAgICAgb2JqU2Vzc2lvbi5zZXRTZXJ2aWNlRW5kcG9pbnROYW1lKHNlcnZpY2VFbmRwb2ludE5hbWUpOwotICAgICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlRW5kcG9pbnROYW1lLG9ialNlc3Npb24uZ2V0U2VydmljZUVuZHBvaW50TmFtZSgpKTsKLSAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdGVzdC9Db25uZWN0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdGVzdC9Db25uZWN0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxN2M4ZDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Rlc3QvQ29ubmVjdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLlJhckVNRlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JUZXN0IGV4dGVuZHMgUmFyRU1GVGVzdCB7Ci0KLSAgICAvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgCXJldHVybiBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRKY2FGYWN0b3J5KCkuY3JlYXRlQ29ubmVjdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRWZXJzaW9uSUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlUkFSKCk7Ci0KLQkJQ29ubmVjdG9yUmVzb3VyY2UgREQgPSAoQ29ubmVjdG9yUmVzb3VyY2UpIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJaW50IHZlcnNpb25JRCA9IERELmdldENvbm5lY3RvcigpLmdldFZlcnNpb25JRCgpOwotCQlhc3NlcnRFcXVhbHModmVyc2lvbklELEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQpOwotCQkKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb25uZWN0b3JUZXN0KCJ0ZXN0X2dldFZlcnNpb25JRCIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdGVzdC9KY2FGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Rlc3QvSmNhRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5MDU5My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdGVzdC9KY2FGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbjsKLQotcHVibGljIGNsYXNzIEpjYUZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBKY2FGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmNhRmFjdG9yeSgpOwotCX0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0pjYUZhY3RvcnkoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSB0bXBKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShKY2FGYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb25uZWN0b3IoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ29ubmVjdG9yIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZUNvbm5lY3RvcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUxpY2Vuc2UoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGljZW5zZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVMaWNlbnNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlcigpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcigpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBPdXRib3VuZFJlc291cmNlQWRhcHRlciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1lc3NhZ2VBZGFwdGVyKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1lc3NhZ2VBZGFwdGVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb24oKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ29ubmVjdGlvbkRlZmluaXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBZG1pbk9iamVjdCgpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBZG1pbk9iamVjdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVBZG1pbk9iamVjdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1lc3NhZ2VMaXN0ZW5lcigpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXNzYWdlTGlzdGVuZXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlTWVzc2FnZUxpc3RlbmVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQWN0aXZhdGlvblNwZWMoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQWN0aXZhdGlvblNwZWMgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlQWN0aXZhdGlvblNwZWMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVJlc291cmNlQWRhcHRlcigpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZXNvdXJjZUFkYXB0ZXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlUmVzb3VyY2VBZGFwdGVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlY3VyaXR5UGVybWlzc2lvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVTZWN1cml0eVBlcm1pc3Npb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUNvbmZpZ1Byb3BlcnR5KCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENvbmZpZ1Byb3BlcnR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZUNvbmZpZ1Byb3BlcnR5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SmNhUGFja2FnZSgpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKY2FQYWNrYWdlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmdldEpjYVBhY2thZ2UoKTsKLSAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvdGVzdC9Kc3BGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL3Rlc3QvSnNwRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxZjk4Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvdGVzdC9Kc3BGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnRlc3QuSmNhRmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZTsKLQotcHVibGljIGNsYXNzIEpzcEZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShKY2FGYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgSnNwRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEpzcFBhY2thZ2UuZUlOU1RBTkNFLmdldEpzcEZhY3RvcnkoKTsKLQl9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVKU1BDb25maWcoKSB7Ci0KLSAgICAgICAgSnNwRmFjdG9yeSBvYmpKc3BGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSlNQQ29uZmlnIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKc3BGYWN0b3J5LmNyZWF0ZUpTUENvbmZpZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUpTUFByb3BlcnR5R3JvdXAoKSB7Ci0KLSAgICAgICAgSnNwRmFjdG9yeSBvYmpKc3BGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSlNQUHJvcGVydHlHcm91cCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSnNwRmFjdG9yeS5jcmVhdGVKU1BQcm9wZXJ0eUdyb3VwKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlVGFnTGliUmVmVHlwZSgpIHsKLQotICAgICAgICBKc3BGYWN0b3J5IG9iakpzcEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBUYWdMaWJSZWZUeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKc3BGYWN0b3J5LmNyZWF0ZVRhZ0xpYlJlZlR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRKc3BQYWNrYWdlKCkgewotCi0gICAgICAgIEpzcEZhY3Rvcnkgb2JqSnNwRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEpzcFBhY2thZ2UgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpzcEZhY3RvcnkuZ2V0SnNwUGFja2FnZSgpOwotICAgICAgICAvLyBUT0RPIGdldFdzZGRQYWNrYWdlIG1ldGhvZCBhbHdheXMgcmV0dXJuIG51bGwKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi90ZXN0L1dlYmFwcGxpY2F0aW9uRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL3Rlc3QvV2ViYXBwbGljYXRpb25GYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2QwYTFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL3Rlc3QvV2ViYXBwbGljYXRpb25GYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24udGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJvbGVOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLQotcHVibGljIGNsYXNzIFdlYmFwcGxpY2F0aW9uRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFdlYmFwcGxpY2F0aW9uRmFjdG9yeVRlc3QuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2ViQXBwKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXZWJBcHAgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVXZWJBcHAoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb250ZXh0UGFyYW0oKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENvbnRleHRQYXJhbSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUNvbnRleHRQYXJhbSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVycm9yUGFnZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRXJyb3JQYWdlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlRXJyb3JQYWdlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlVGFnTGliUmVmKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBUYWdMaWJSZWYgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVUYWdMaWJSZWYoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFeGNlcHRpb25UeXBlRXJyb3JQYWdlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVycm9yQ29kZUVycm9yUGFnZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRXJyb3JDb2RlRXJyb3JQYWdlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2VsY29tZUZpbGVMaXN0KCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXZWxjb21lRmlsZUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVXZWxjb21lRmlsZUxpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXZWxjb21lRmlsZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgV2VsY29tZUZpbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVXZWxjb21lRmlsZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlY3VyaXR5Q29uc3RyYWludCgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXZWJSZXNvdXJjZUNvbGxlY3Rpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVVUkxQYXR0ZXJuVHlwZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgVVJMUGF0dGVyblR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVVUkxQYXR0ZXJuVHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUF1dGhDb25zdHJhaW50KCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBdXRoQ29uc3RyYWludCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUF1dGhDb25zdHJhaW50KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlVXNlckRhdGFDb25zdHJhaW50KCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBVc2VyRGF0YUNvbnN0cmFpbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVMb2dpbkNvbmZpZygpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTG9naW5Db25maWcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVMb2dpbkNvbmZpZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUZvcm1Mb2dpbkNvbmZpZygpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRm9ybUxvZ2luQ29uZmlnIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlRm9ybUxvZ2luQ29uZmlnKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWltZU1hcHBpbmcoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1pbWVNYXBwaW5nIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlTWltZU1hcHBpbmcoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZXNzaW9uQ29uZmlnKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXNzaW9uQ29uZmlnIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlU2Vzc2lvbkNvbmZpZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlcnZsZXRNYXBwaW5nKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXJ2bGV0TWFwcGluZyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVNlcnZsZXRNYXBwaW5nKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VydmxldCgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VydmxldCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVNlcnZsZXQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZXJ2bGV0VHlwZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VydmxldFR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2bGV0VHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUpTUFR5cGUoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEpTUFR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVKU1BUeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSW5pdFBhcmFtKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBJbml0UGFyYW0gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVJbml0UGFyYW0oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVGaWx0ZXIoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEZpbHRlciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUZpbHRlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUZpbHRlck1hcHBpbmcoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEZpbHRlck1hcHBpbmcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVGaWx0ZXJNYXBwaW5nKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZygpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTG9jYWxFbmNvZGluZ01hcHBpbmcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUhUVFBNZXRob2RUeXBlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBIVFRQTWV0aG9kVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUhUVFBNZXRob2RUeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUm9sZU5hbWVUeXBlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSb2xlTmFtZVR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVSb2xlTmFtZVR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRXZWJhcHBsaWNhdGlvblBhY2thZ2UoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdlYmFwcGxpY2F0aW9uUGFja2FnZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmdldFdlYmFwcGxpY2F0aW9uUGFja2FnZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vdGVzdC9Xc2NvbW1vbkZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL3Rlc3QvV3Njb21tb25GYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTc2NGZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vdGVzdC9Xc2NvbW1vbkZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24udGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotcHVibGljIGNsYXNzIFdzY29tbW9uRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFdzY29tbW9uRmFjdG9yeVRlc3QuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFdzY29tbW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3Njb21tb25GYWN0b3J5KCk7Ci0JfQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSW5pdFBhcmFtKCkgewotCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBvYmpXc2NvbW1vbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBJbml0UGFyYW0gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzY29tbW9uRmFjdG9yeS5jcmVhdGVJbml0UGFyYW0oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTT0FQSGVhZGVyKCkgewotCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBvYmpXc2NvbW1vbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTT0FQSGVhZGVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2NvbW1vbkZhY3RvcnkuY3JlYXRlU09BUEhlYWRlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNPQVBSb2xlKCkgewotCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBvYmpXc2NvbW1vbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTT0FQUm9sZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3Njb21tb25GYWN0b3J5LmNyZWF0ZVNPQVBSb2xlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUG9ydE5hbWUoKSB7Ci0KLSAgICAgICAgV3Njb21tb25GYWN0b3J5IG9ialdzY29tbW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFBvcnROYW1lIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2NvbW1vbkZhY3RvcnkuY3JlYXRlUG9ydE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSB7Ci0KLSAgICAgICAgV3Njb21tb25GYWN0b3J5IG9ialdzY29tbW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIERlc2NyaXB0aW9uVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3Njb21tb25GYWN0b3J5LmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZURpc3BsYXlOYW1lVHlwZSgpIHsKLQotICAgICAgICBXc2NvbW1vbkZhY3Rvcnkgb2JqV3Njb21tb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRGlzcGxheU5hbWVUeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2NvbW1vbkZhY3RvcnkuY3JlYXRlRGlzcGxheU5hbWVUeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0V3Njb21tb25QYWNrYWdlKCkgewotCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBvYmpXc2NvbW1vbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXc2NvbW1vblBhY2thZ2UgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzY29tbW9uRmFjdG9yeS5nZXRXc2NvbW1vblBhY2thZ2UoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL3Rlc3QvV3NkZEZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvdGVzdC9Xc2RkRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxMGFiOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvdGVzdC9Xc2RkRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBXc2RkRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFdzZGRGYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgV3NkZEZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3NkZEZhY3RvcnkoKTsKLQl9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXZWJTZXJ2aWNlcygpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdlYlNlcnZpY2VzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2RkRmFjdG9yeS5jcmVhdGVXZWJTZXJ2aWNlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUG9ydENvbXBvbmVudCgpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFBvcnRDb21wb25lbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzZGRGYWN0b3J5LmNyZWF0ZVBvcnRDb21wb25lbnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXU0RMUG9ydCgpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdTRExQb3J0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2RkRmFjdG9yeS5jcmVhdGVXU0RMUG9ydCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlcnZpY2VJbXBsQmVhbigpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlcnZpY2VJbXBsQmVhbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlU2VydmljZUltcGxCZWFuKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VydmxldExpbmsoKSB7Ci0KLSAgICAgICAgV3NkZEZhY3Rvcnkgb2JqV3NkZEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXJ2bGV0TGluayByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlU2VydmxldExpbmsoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFSkJMaW5rKCkgewotCi0gICAgICAgIFdzZGRGYWN0b3J5IG9ialdzZGRGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCTGluayByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlRUpCTGluaygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUhhbmRsZXIoKSB7Ci0KLSAgICAgICAgV3NkZEZhY3Rvcnkgb2JqV3NkZEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBIYW5kbGVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2RkRmFjdG9yeS5jcmVhdGVIYW5kbGVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQmVhbkxpbmsoKSB7Ci0KLSAgICAgICAgV3NkZEZhY3Rvcnkgb2JqV3NkZEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBCZWFuTGluayByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlQmVhbkxpbmsoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvb3V0LnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvb3V0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkMzBjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL291dC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4NCi08b3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6SmF2YUNsYXNzIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE9ImphdmEueG1pIiBuYW1lPSJBIiBraW5kPSJDTEFTUyIgcHVibGljPSJ0cnVlIj4NCi0gIDxlU3VwZXJUeXBlcyBocmVmPSJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0Ii8+DQotICA8aW1wbGVtZW50c0ludGVyZmFjZXMgaHJlZj0iamF2YTovY29tLmlibS5ldG9vbHMuamF2YS5zdHJlc3NTYW1wbGUjSUEiLz4NCi0gIDxmaWVsZHMgbmFtZT0iYW5BIiBlVHlwZT0iLyIvPg0KLSAgPGZpZWxkcyBuYW1lPSJhQiI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6SmF2YUNsYXNzIiBocmVmPSJqYXZhOi9jb20uaWJtLmV0b29scy5qYXZhLnN0cmVzc1NhbXBsZSNCIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iYmVlcyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi9jb20uaWJtLmV0b29scy5qYXZhLnN0cmVzc1NhbXBsZSNCW10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJiZWVzX2FuZF9iZWVzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6L2NvbS5pYm0uZXRvb2xzLmphdmEuc3RyZXNzU2FtcGxlI0JbXVtdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iaW50cyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jaW50W10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJpbnRzMiI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jaW50W11bXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImludHMzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNpbnRbXVtdW10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJjaGFycyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jY2hhcltdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iZmxvYXRzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNmbG9hdFtdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iY29vbHMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2Jvb2xlYW5bXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImRvdWJsZXMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2RvdWJsZVtdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0ibG9uZ3MiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2xvbmdbXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9InNob3J0cyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jc2hvcnRbXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImJ5dGVzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNieXRlW10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJ0ZXN0U3RyaW5nIiBmaW5hbD0idHJ1ZSIgc3RhdGljPSJ0cnVlIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpKYXZhQ2xhc3MiIGhyZWY9ImphdmE6L2phdmEubGFuZyNTdHJpbmciLz4NCi0gICAgPGluaXRpYWxpemVyIHNvdXJjZT0iJnF1b3Q7dGVzdGluZyZxdW90OyIgbmFtZT0idGVzdFN0cmluZ19ibG9jayIvPg0KLSAgPC9maWVsZHM+DQotICA8bWV0aG9kcyBuYW1lPSJkb0FsbFByaW1pdGl2ZXMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkphdmFEYXRhVHlwZSIgaHJlZj0iamF2YTovI3ZvaWQiLz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnMCI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNpbnRbXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzEiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jaW50W11bXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzIiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jaW50W11bXVtdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnMyI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNjaGFyW10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmc0Ij4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2Zsb2F0W10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmc1Ij4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2Jvb2xlYW5bXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzYiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jZG91YmxlW10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmc3Ij4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2xvbmdbXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzgiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jc2hvcnRbXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzkiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jYnl0ZVtdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gIDwvbWV0aG9kcz4NCi0gIDxtZXRob2RzIG5hbWU9ImRvU29tZXRoaW5nIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpKYXZhQ2xhc3MiIGhyZWY9ImphdmE6L2NvbS5pYm0uZXRvb2xzLmphdmEuc3RyZXNzU2FtcGxlI0MiLz4NCi0gIDwvbWV0aG9kcz4NCi0gIDxtZXRob2RzIG5hbWU9ImdldEJ5dGVzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNieXRlW10iLz4NCi0gIDwvbWV0aG9kcz4NCi0gIDxtZXRob2RzIG5hbWU9ImdldENoYXIiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2NoYXJbXSIvPg0KLSAgPC9tZXRob2RzPg0KLSAgPG1ldGhvZHMgbmFtZT0iZ2V0RmxvYXRzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNmbG9hdFtdIi8+DQotICA8L21ldGhvZHM+DQotICA8bWV0aG9kcyBuYW1lPSJnZXRJbnRzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNpbnRbXSIvPg0KLSAgPC9tZXRob2RzPg0KLSAgPG1ldGhvZHMgbmFtZT0iZ2V0TG9uZ3MiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2xvbmdbXSIvPg0KLSAgPC9tZXRob2RzPg0KLSAgPG1ldGhvZHMgbmFtZT0iZ2V0U2hvcnRzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNzaG9ydFtdIi8+DQotICA8L21ldGhvZHM+DQotICA8bWV0aG9kcyBuYW1lPSJyZXR1cm5BcyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi9jb20uaWJtLmV0b29scy5qYXZhLnN0cmVzc1NhbXBsZSNBW10iLz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnMCI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6L2NvbS5pYm0uZXRvb2xzLmphdmEuc3RyZXNzU2FtcGxlI0NbXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICA8L21ldGhvZHM+DQotICA8bWV0aG9kcyBuYW1lPSJBIiBjb25zdHJ1Y3Rvcj0idHJ1ZSIvPg0KLTwvb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6SmF2YUNsYXNzPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDI0NWFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cwotQnVuZGxlLU5hbWUuMCA9IEoyRUUgQ29yZSBUZXN0cyBDb21wb25lbnQKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZjJiMjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gPCEtLSA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cyIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSItWG14NzAwTSIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpzdC1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vanN0X2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2pzdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtqc3QtZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQiIC8+Ci0gICAJICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgCSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4KLSAgICA8L2FudD4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7anN0LWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5hcGkudGVzdC5BdXRvbWF0ZWRBUElCVlQiIC8+Ci0gICAJICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgCSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDQxNjUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNS40IAotQ3JlYXRlZC1CeTogMS4zLjAgKElCTSBDb3Jwb3JhdGlvbikKLU1haW4tQ2xhc3M6IG51bGwKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvVGFibGUuZGRsIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvVGFibGUuZGRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzgwODYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL1RhYmxlLmRkbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQ0KLQ0KLS0tIEdlbmVyYXRlZCBieSBSZWxhdGlvbmFsIFNjaGVtYSBDZW50ZXIgb24gRnJpIE1hciAxMiAxNDozMjoxNCBDU1QgMjAwNA0KLQ0KLQ0KLUNSRUFURSBUQUJMRSBBQ0NPVU5UDQotICAoQUNDT1VOVElEIFZBUkNIQVIoMjUwKSBOT1QgTlVMTCwNCi0gICBUWVBFMSBJTlRFR0VSIE5PVCBOVUxMLA0KLSAgIEJBTEFOQ0UgRE9VQkxFIFBSRUNJU0lPTiBOT1QgTlVMTCwNCi0gICBBUFIgRE9VQkxFIFBSRUNJU0lPTiBOT1QgTlVMTCk7DQotDQotQUxURVIgVEFCTEUgQUNDT1VOVA0KLSAgQUREIENPTlNUUkFJTlQgUEtfQUNDT1VOVCBQUklNQVJZIEtFWSAoQUNDT1VOVElEKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL01hcC5tYXB4bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL01hcC5tYXB4bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOWE5OGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9NYXAubWFweG1pCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZWpicmRibWFwcGluZzpFamJSZGJEb2N1bWVudFJvb3QgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpSREJTY2hlbWE9IlJEQlNjaGVtYS54bWkiIHhtbG5zOmVqYj0iZWpiLnhtaSIgeG1sbnM6ZWpicmRibWFwcGluZz0iZWpicmRibWFwcGluZy54bWkiIHhtbG5zOk1hcHBpbmc9Ik1hcHBpbmcueG1pIiB4bWk6aWQ9IkVqYlJkYkRvY3VtZW50Um9vdF8xMDc5MTIzNTE2OTA3IiB0b3BUb0JvdHRvbT0idHJ1ZSIgY29tbWFuZFN0YWNrPSImbHQ7Y29sbGVjdGlvbj4mbHQ7Y29tbWFuZC1jcmVhdGlvbi1yZWNvcmQ+Jmx0O2NsYXNzIG5hbWU9JnF1b3Q7Y29tLmlibS5ldG9vbHMuZWpicmRibWFwcGluZy5jb21tYW5kLlRvcERvd25FamJKYXJDb21tYW5kJnF1b3Q7Lz4mbHQ7Y29tbWFuZC1wYXJhbWV0ZXI+Jmx0O3JlZi1vYmplY3QgaHJlZj0mcXVvdDtwbGF0Zm9ybTovcmVzb3VyY2UvYjYzNzQ4YmEvZWpiTW9kdWxlL01FVEEtSU5GL2VqYi1qYXIueG1sI2VqYi1qYXJfSUQmcXVvdDsvPiZsdDtudWxsLz4mbHQ7Y29sbGVjdGlvbj4mbHQ7c3RyaW5nIHZhbHVlPSZxdW90O1RvcERvd25EQiZxdW90Oy8+Jmx0O251bGwvPiZsdDtpbnQgdmFsdWU9JnF1b3Q7MTgmcXVvdDsvPiZsdDtoYXNodGFibGU+Jmx0Oy9oYXNodGFibGU+Jmx0O2hhc2h0YWJsZT4mbHQ7L2hhc2h0YWJsZT4mbHQ7Ym9vbGVhbiB2YWx1ZT0mcXVvdDtmYWxzZSZxdW90Oy8+Jmx0O2Jvb2xlYW4gdmFsdWU9JnF1b3Q7ZmFsc2UmcXVvdDsvPiZsdDsvY29sbGVjdGlvbj4mbHQ7bnVsbC8+Jmx0O2ludCB2YWx1ZT0mcXVvdDstMSZxdW90Oy8+Jmx0Oy9jb21tYW5kLXBhcmFtZXRlcj4mbHQ7L2NvbW1hbmQtY3JlYXRpb24tcmVjb3JkPiZsdDsvY29sbGVjdGlvbj4iPg0KLSAgPGhlbHBlciB4bWk6dHlwZT0iZWpicmRibWFwcGluZzpSZGJTY2hlbWFQcm9wZXJpZXMiIHhtaTppZD0iUmRiU2NoZW1hUHJvcGVyaWVzXzEwNzkxMjM1MTY5MDciIHByaW1pdGl2ZXNEb2N1bWVudD0iQ0xPVURTQ0FQRV9WNTAiLz4NCi0gIDxuZXN0ZWQgeG1pOnR5cGU9ImVqYnJkYm1hcHBpbmc6UkRCRWpiTWFwcGVyIiB4bWk6aWQ9IlJEQkVqYk1hcHBlcl8xMDc5MTIzNTE2OTA3Ij4NCi0gICAgPGhlbHBlciB4bWk6dHlwZT0iZWpicmRibWFwcGluZzpQcmltYXJ5VGFibGVTdHJhdGVneSIgeG1pOmlkPSJQcmltYXJ5VGFibGVTdHJhdGVneV8xMDc5MTIzNTE2OTA3Ij4NCi0gICAgICA8dGFibGUgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pI0FDQ09VTlQiLz4NCi0gICAgPC9oZWxwZXI+DQotICAgIDxuZXN0ZWQgeG1pOnR5cGU9ImVqYnJkYm1hcHBpbmc6UkRCRWpiRmllbGRNYXBwZXIiIHhtaTppZD0iUkRCRWpiRmllbGRNYXBwZXJfMTA3OTEyMzUxNjkwNyI+DQotICAgICAgPGlucHV0cyB4bWk6dHlwZT0iZWpiOkNNUEF0dHJpYnV0ZSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQWNjb3VudF9hY2NvdW50aWQiLz4NCi0gICAgICA8b3V0cHV0cyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQkNvbHVtbiIgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pI0FDQ09VTlRJRCIvPg0KLSAgICAgIDx0eXBlTWFwcGluZyBocmVmPSJKYXZhdG9DTE9VRFNDQVBFX1Y1MFR5cGVNYXBzLnhtaSNTdHJpbmctVkFSQ0hBUiIvPg0KLSAgICA8L25lc3RlZD4NCi0gICAgPG5lc3RlZCB4bWk6dHlwZT0iZWpicmRibWFwcGluZzpSREJFamJGaWVsZE1hcHBlciIgeG1pOmlkPSJSREJFamJGaWVsZE1hcHBlcl8xMDc5MTIzNTE2OTA4IiBvcHRpbWlzdGljPSJ0cnVlIj4NCi0gICAgICA8aW5wdXRzIHhtaTp0eXBlPSJlamI6Q01QQXR0cmlidXRlIiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNBY2NvdW50X3R5cGUiLz4NCi0gICAgICA8b3V0cHV0cyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQkNvbHVtbiIgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pI1RZUEUxIi8+DQotICAgICAgPHR5cGVNYXBwaW5nIGhyZWY9IkphdmF0b0NMT1VEU0NBUEVfVjUwVHlwZU1hcHMueG1pI2ludC1JTlRFR0VSIi8+DQotICAgIDwvbmVzdGVkPg0KLSAgICA8bmVzdGVkIHhtaTp0eXBlPSJlamJyZGJtYXBwaW5nOlJEQkVqYkZpZWxkTWFwcGVyIiB4bWk6aWQ9IlJEQkVqYkZpZWxkTWFwcGVyXzEwNzkxMjM1MTY5MDkiIG9wdGltaXN0aWM9InRydWUiPg0KLSAgICAgIDxpbnB1dHMgeG1pOnR5cGU9ImVqYjpDTVBBdHRyaWJ1dGUiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0FjY291bnRfYmFsYW5jZSIvPg0KLSAgICAgIDxvdXRwdXRzIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCQ29sdW1uIiBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkjQkFMQU5DRSIvPg0KLSAgICAgIDx0eXBlTWFwcGluZyBocmVmPSJKYXZhdG9DTE9VRFNDQVBFX1Y1MFR5cGVNYXBzLnhtaSNkb3VibGUtRE9VQkxFIi8+DQotICAgIDwvbmVzdGVkPg0KLSAgICA8bmVzdGVkIHhtaTp0eXBlPSJlamJyZGJtYXBwaW5nOlJEQkVqYkZpZWxkTWFwcGVyIiB4bWk6aWQ9IlJEQkVqYkZpZWxkTWFwcGVyXzEwNzkxMjM1MTY5MTAiIG9wdGltaXN0aWM9InRydWUiPg0KLSAgICAgIDxpbnB1dHMgeG1pOnR5cGU9ImVqYjpDTVBBdHRyaWJ1dGUiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0FjY291bnRfYXByIi8+DQotICAgICAgPG91dHB1dHMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJDb2x1bW4iIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaSNBUFIiLz4NCi0gICAgICA8dHlwZU1hcHBpbmcgaHJlZj0iSmF2YXRvQ0xPVURTQ0FQRV9WNTBUeXBlTWFwcy54bWkjZG91YmxlLURPVUJMRSIvPg0KLSAgICA8L25lc3RlZD4NCi0gICAgPGlucHV0cyB4bWk6dHlwZT0iZWpiOkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0NvbnRhaW5lck1hbmFnZWRFbnRpdHlfMSIvPg0KLSAgICA8b3V0cHV0cyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQlRhYmxlIiBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkjQUNDT1VOVCIvPg0KLSAgPC9uZXN0ZWQ+DQotICA8aW5wdXRzIHhtaTp0eXBlPSJlamI6RUpCSmFyIiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEIi8+DQotICA8b3V0cHV0cyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQkRhdGFiYXNlIiBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQi5kYnhtaSNUb3BEb3duREIiLz4NCi0gIDx0eXBlTWFwcGluZyB4bWk6dHlwZT0iTWFwcGluZzpNYXBwaW5nUm9vdCIgaHJlZj0iSmF2YXRvQ0xPVURTQ0FQRV9WNTBUeXBlTWFwcy54bWkjSmF2YV90b19DTE9VRFNDQVBFX1Y1MF9UeXBlTWFwcyIvPg0KLTwvZWpicmRibWFwcGluZzpFamJSZGJEb2N1bWVudFJvb3Q+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9UYWJsZS5kZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RhYmxlLmRkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4MDg2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RhYmxlLmRkbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQ0KLQ0KLS0tIEdlbmVyYXRlZCBieSBSZWxhdGlvbmFsIFNjaGVtYSBDZW50ZXIgb24gRnJpIE1hciAxMiAxNDozMjoxNCBDU1QgMjAwNA0KLQ0KLQ0KLUNSRUFURSBUQUJMRSBBQ0NPVU5UDQotICAoQUNDT1VOVElEIFZBUkNIQVIoMjUwKSBOT1QgTlVMTCwNCi0gICBUWVBFMSBJTlRFR0VSIE5PVCBOVUxMLA0KLSAgIEJBTEFOQ0UgRE9VQkxFIFBSRUNJU0lPTiBOT1QgTlVMTCwNCi0gICBBUFIgRE9VQkxFIFBSRUNJU0lPTiBOT1QgTlVMTCk7DQotDQotQUxURVIgVEFCTEUgQUNDT1VOVA0KLSAgQUREIENPTlNUUkFJTlQgUEtfQUNDT1VOVCBQUklNQVJZIEtFWSAoQUNDT1VOVElEKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQi5kYnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCLmRieG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTRiZGVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCLmRieG1pCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxSREJTY2hlbWE6UkRCRGF0YWJhc2UgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpSREJTY2hlbWE9IlJEQlNjaGVtYS54bWkiIHhtaTppZD0iVG9wRG93bkRCIiBuYW1lPSJUb3BEb3duREIiPg0KLSAgPHNjaGVtYXRhIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRC5zY2h4bWkjTlVMTElEIi8+DQotICA8dGFibGVHcm91cCB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQlRhYmxlIiBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkjQUNDT1VOVCIvPg0KLSAgPGRvbWFpbiBocmVmPSJDTE9VRFNDQVBFX1Y1MF9Eb21haW4ueG1pI1NRTFZlbmRvcl8xIi8+DQotPC9SREJTY2hlbWE6UkRCRGF0YWJhc2U+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElELnNjaHhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRC5zY2h4bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMjBhNDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElELnNjaHhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08UkRCU2NoZW1hOlJEQlNjaGVtYSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOlJEQlNjaGVtYT0iUkRCU2NoZW1hLnhtaSIgeG1pOmlkPSJOVUxMSUQiIG5hbWU9Ik5VTExJRCI+DQotICA8ZGF0YWJhc2UgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREIuZGJ4bWkjVG9wRG93bkRCIi8+DQotICA8dGFibGVzIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCVGFibGUiIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaSNBQ0NPVU5UIi8+DQotPC9SREJTY2hlbWE6UkRCU2NoZW1hPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmMWQ3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxSREJTY2hlbWE6UkRCVGFibGUgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpSREJTY2hlbWE9IlJEQlNjaGVtYS54bWkiIHhtaTppZD0iQUNDT1VOVCIgbmFtZT0iQUNDT1VOVCIgcHJpbWFyeUtleT0iUEtfQUNDT1VOVCI+DQotICA8ZGF0YWJhc2UgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREIuZGJ4bWkjVG9wRG93bkRCIi8+DQotICA8c2NoZW1hIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRC5zY2h4bWkjTlVMTElEIi8+DQotICA8Y29sdW1ucyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQkNvbHVtbiIgeG1pOmlkPSJBQ0NPVU5USUQiIG5hbWU9IkFDQ09VTlRJRCI+DQotICAgIDx0eXBlIHhtaTp0eXBlPSJSREJTY2hlbWE6U1FMQ2hhcmFjdGVyU3RyaW5nVHlwZSIgeG1pOmlkPSJTUUxDaGFyYWN0ZXJTdHJpbmdUeXBlXzEwNzkxMjM1MTY5NzciIGxlbmd0aD0iMjUwIj4NCi0gICAgICA8b3JpZ2luYXRpbmdUeXBlIHhtaTp0eXBlPSJSREJTY2hlbWE6U1FMQ2hhcmFjdGVyU3RyaW5nVHlwZSIgaHJlZj0iSmF2YXRvQ0xPVURTQ0FQRV9WNTBUeXBlTWFwcy54bWkjU1FMQ2hhcmFjdGVyU3RyaW5nVHlwZV8yNTAiLz4NCi0gICAgPC90eXBlPg0KLSAgPC9jb2x1bW5zPg0KLSAgPGNvbHVtbnMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJDb2x1bW4iIHhtaTppZD0iVFlQRTEiIG5hbWU9IlRZUEUxIj4NCi0gICAgPHR5cGUgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxFeGFjdE51bWVyaWMiIHhtaTppZD0iU1FMRXhhY3ROdW1lcmljXzEwNzkxMjM1MTY5NzciPg0KLSAgICAgIDxvcmlnaW5hdGluZ1R5cGUgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxFeGFjdE51bWVyaWMiIGhyZWY9IkNMT1VEU0NBUEVfVjUwX1ByaW1pdGl2ZXMueG1pI1NRTEV4YWN0TnVtZXJpY18xIi8+DQotICAgIDwvdHlwZT4NCi0gIDwvY29sdW1ucz4NCi0gIDxjb2x1bW5zIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCQ29sdW1uIiB4bWk6aWQ9IkJBTEFOQ0UiIG5hbWU9IkJBTEFOQ0UiPg0KLSAgICA8dHlwZSB4bWk6dHlwZT0iUkRCU2NoZW1hOlNRTEFwcHJveGltYXRlTnVtZXJpYyIgeG1pOmlkPSJTUUxBcHByb3hpbWF0ZU51bWVyaWNfMTA3OTEyMzUxNjk3NyI+DQotICAgICAgPG9yaWdpbmF0aW5nVHlwZSB4bWk6dHlwZT0iUkRCU2NoZW1hOlNRTEFwcHJveGltYXRlTnVtZXJpYyIgaHJlZj0iQ0xPVURTQ0FQRV9WNTBfUHJpbWl0aXZlcy54bWkjU1FMQXBwcm94aW1hdGVOdW1lcmljXzEiLz4NCi0gICAgPC90eXBlPg0KLSAgPC9jb2x1bW5zPg0KLSAgPGNvbHVtbnMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJDb2x1bW4iIHhtaTppZD0iQVBSIiBuYW1lPSJBUFIiPg0KLSAgICA8dHlwZSB4bWk6dHlwZT0iUkRCU2NoZW1hOlNRTEFwcHJveGltYXRlTnVtZXJpYyIgeG1pOmlkPSJTUUxBcHByb3hpbWF0ZU51bWVyaWNfMTA3OTEyMzUxNjk3OCI+DQotICAgICAgPG9yaWdpbmF0aW5nVHlwZSB4bWk6dHlwZT0iUkRCU2NoZW1hOlNRTEFwcHJveGltYXRlTnVtZXJpYyIgaHJlZj0iQ0xPVURTQ0FQRV9WNTBfUHJpbWl0aXZlcy54bWkjU1FMQXBwcm94aW1hdGVOdW1lcmljXzEiLz4NCi0gICAgPC90eXBlPg0KLSAgPC9jb2x1bW5zPg0KLSAgPG5hbWVkR3JvdXAgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxSZWZlcmVuY2UiIHhtaTppZD0iUEtfQUNDT1VOVCIgbmFtZT0iUEtfQUNDT1VOVCIgbWVtYmVycz0iQUNDT1VOVElEIiBjb25zdHJhaW50PSJTUUxDb25zdHJhaW50XzEwNzkxMjM1MTY5NzciLz4NCi0gIDxjb25zdHJhaW50cyB4bWk6aWQ9IlNRTENvbnN0cmFpbnRfMTA3OTEyMzUxNjk3NyIgbmFtZT0iUEtfQUNDT1VOVCIgdHlwZT0iUFJJTUFSWUtFWSIgcHJpbWFyeUtleT0iUEtfQUNDT1VOVCIvPg0KLTwvUkRCU2NoZW1hOlJEQlRhYmxlPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvaWJtX3BtYmFiLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL2libV9wbWJhYi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmY2MmQzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvaWJtX3BtYmFiLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNGcmkgTWFyIDEyIDE0OjMyOjAxIENTVCAyMDA0Ci1BY2NvdW50PWNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMuYXBwcHJvZmlsZS5hY2NvdW50bWFuYWdlbWVudGVqYi53ZWJzcGhlcmVfZGVwbG95LkNMT1VEU0NBUEVfVjUwXzEuQWNjb3VudEJlYW5BZGFwdG9yQmluZGluZ18wYzE4MjEzNQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvZWpiLWphci54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9lamItamFyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5ODYwZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9lamItamFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIj4KLQotICAgPGVqYi1qYXIgaWQ9ImVqYi1qYXJfSUQiPgotICAgICAgPGRpc3BsYXktbmFtZT5BcHBQcm9maWxlU2FtcGxlRUpCTW9kdWxlPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8ZW50ZXJwcmlzZS1iZWFucz4KLSAgICAgICAgIDxlbnRpdHkgaWQ9IkNvbnRhaW5lck1hbmFnZWRFbnRpdHlfMSI+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+QWNjb3VudDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuQWNjb3VudEhvbWU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMuYXBwcHJvZmlsZS5hY2NvdW50bWFuYWdlbWVudGVqYi5BY2NvdW50PC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuTG9jYWxBY2NvdW50SG9tZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuTG9jYWxBY2NvdW50PC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkFjY291bnRCZWFuPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLSAgICAgICAgICAgIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT5BY2NvdW50PC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLSAgICAgICAgICAgIDxjbXAtZmllbGQgaWQ9IkFjY291bnRfYWNjb3VudGlkIj4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPmFjY291bnRpZDwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZCBpZD0iQWNjb3VudF90eXBlIj4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPnR5cGU8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQgaWQ9IkFjY291bnRfYmFsYW5jZSI+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5iYWxhbmNlPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkIGlkPSJBY2NvdW50X2FwciI+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5hcHI8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxwcmlta2V5LWZpZWxkPmFjY291bnRpZDwvcHJpbWtleS1maWVsZD4KLSAgICAgICAgICAgIDxxdWVyeSBpZD0iUXVlcnlfMSI+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kIGlkPSJRdWVyeU1ldGhvZF8xIj4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VBY2NvdW50czwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+ZG91YmxlPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxlamItcWw+U0VMRUNUIE9CSkVDVChhKSBGUk9NIEFjY291bnQgYSBXSEVSRSBhLmJhbGFuY2UgPj0gPzE8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnkgaWQ9IlF1ZXJ5XzIiPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZCBpZD0iUXVlcnlNZXRob2RfMiI+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+ZmluZEJ5QWNjb3VudElkPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxlamItcWw+U0VMRUNUIE9CSkVDVChhKSBGUk9NIEFjY291bnQgYSBXSEVSRSBhLmFjY291bnRpZCAgPSA/MTwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeSBpZD0iUXVlcnlfMyI+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kIGlkPSJRdWVyeU1ldGhvZF8zIj4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5maW5kQWxsQWNjb3VudHM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPlNFTEVDVCBPQkpFQ1QoYSkgRlJPTSBBY2NvdW50IGE8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgIDxzZXNzaW9uIGlkPSJTZXNzaW9uXzEiPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5BY2NvdW50TWFuYWdlcjwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPGVqYi1uYW1lPkFjY291bnRNYW5hZ2VyPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMuYXBwcHJvZmlsZS5hY2NvdW50bWFuYWdlbWVudGVqYi5BY2NvdW50TWFuYWdlckhvbWU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMuYXBwcHJvZmlsZS5hY2NvdW50bWFuYWdlbWVudGVqYi5BY2NvdW50TWFuYWdlcjwvcmVtb3RlPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuQWNjb3VudE1hbmFnZXJCZWFuPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8c2Vzc2lvbi10eXBlPlN0YXRlbGVzczwvc2Vzc2lvbi10eXBlPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+Q29udGFpbmVyPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEiPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5lamIvQXBwUHJvZmlsZVNhbXBsZS1BY2NvdW50SG9tZTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMuYXBwcHJvZmlsZS5hY2NvdW50bWFuYWdlbWVudGVqYi5Mb2NhbEFjY291bnRIb21lPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMuYXBwcHJvZmlsZS5hY2NvdW50bWFuYWdlbWVudGVqYi5Mb2NhbEFjY291bnQ8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPkFjY291bnQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgPC9zZXNzaW9uPgotICAgICAgPC9lbnRlcnByaXNlLWJlYW5zPgotICAgPC9lamItamFyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWJuZC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OTBkNDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGVqYmJuZDpFSkJKYXJCaW5kaW5nIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWpiYm5kPSJlamJibmQueG1pIiB4bWxuczplamI9ImVqYi54bWkiIHhtbG5zOmNvbW1vbj0iY29tbW9uLnhtaSIgeG1pOmlkPSJlamItamFyX0lEX0JuZCIgY3VycmVudEJhY2tlbmRJZD0iQ0xPVURTQ0FQRV9WNTBfMSI+DQotICA8ZWpiSmFyIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI2VqYi1qYXJfSUQiLz4NCi0gIDxlamJCaW5kaW5ncyB4bWk6aWQ9IkNvbnRhaW5lck1hbmFnZWRFbnRpdHlfMV9CbmQiIGpuZGlOYW1lPSJBcHBQcm9maWxlU2FtcGxlLUFjY291bnRIb21lIj4NCi0gICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQ29udGFpbmVyTWFuYWdlZEVudGl0eV8xIi8+DQotICA8L2VqYkJpbmRpbmdzPg0KLSAgPGVqYkJpbmRpbmdzIHhtaTppZD0iRW50ZXJwcmlzZUJlYW5CaW5kaW5nXzEiIGpuZGlOYW1lPSJBcHBQcm9maWxlU2FtcGxlLUFjY291bnRNYW5hZ2VySG9tZSI+DQotICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOlNlc3Npb24iIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI1Nlc3Npb25fMSIvPg0KLSAgICA8ZWpiUmVmQmluZGluZ3MgeG1pOmlkPSJFamJSZWZCaW5kaW5nXzEiIGpuZGlOYW1lPSJBcHBQcm9maWxlU2FtcGxlLUFjY291bnRIb21lIj4NCi0gICAgICA8YmluZGluZ0VqYlJlZiB4bWk6dHlwZT0iY29tbW9uOkVKQkxvY2FsUmVmIiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNFSkJMb2NhbFJlZl8xIi8+DQotICAgIDwvZWpiUmVmQmluZGluZ3M+DQotICA8L2VqYkJpbmRpbmdzPg0KLSAgPGRlZmF1bHRDTVBDb25uZWN0aW9uRmFjdG9yeSB4bWk6aWQ9IkNNUENvbm5lY3Rpb25GYWN0b3J5QmluZGluZ18yIiBqbmRpTmFtZT0iZWlzL2pkYmMvQXBwUHJvZmlsZVNhbXBsZURCX0NNUCIgcmVzQXV0aD0iUGVyX0Nvbm5lY3Rpb25fRmFjdG9yeSIvPg0KLTwvZWpiYm5kOkVKQkphckJpbmRpbmc+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LXBtZS54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9pYm0tZWpiLWphci1leHQtcG1lLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlZWNiMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9pYm0tZWpiLWphci1leHQtcG1lLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHBtZWV4dDpQTUVFSkJKYXJFeHRlbnNpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczphcHBwcm9maWxlZWpiZXh0PSJodHRwOi8vd3d3LmlibS5jb20vd2Vic3BoZXJlL2FwcHNlcnZlci9zY2hlbWFzLzUuMC9hcHBwcm9maWxlZWpiZXh0LnhtaSIgeG1sbnM6ZWpiZXh0PSJlamJleHQueG1pIiB4bWxuczplamI9ImVqYi54bWkiIHhtbG5zOnBtZWV4dD0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNwaGVyZS9hcHBzZXJ2ZXIvc2NoZW1hcy81LjAvcG1lZXh0LnhtaSIgeG1pOmlkPSJQTUVFSkJKYXJFeHRlbnNpb25fMSI+DQotICA8YXBwUHJvZmlsZUVKQkphckV4dGVuc2lvbiB4bWk6aWQ9IkFwcFByb2ZpbGVFSkJKYXJFeHRlbnNpb25fMSI+DQotICAgIDxhcHBsaWNhdGlvblByb2ZpbGVzIHhtaTppZD0iRUpCTW9kdWxlUHJvZmlsZV8xIiBuYW1lPSJSZWFkLW9ubHkiIGRlc2NyaXB0aW9uPSJUaGlzIHByb2ZpbGUgd2lsbCBhcHBseSBhIHJlYWQtb25seSBhY2Nlc3MtaW50ZW50IHBvbGljeSB0byB0aGUgbXVsdGlmaW5kZXIgZm9yIHRoZSBBY2NvdW50IGVudGl0eSBiZWFuLiI+DQotICAgICAgPGFwcGxpZWRBY2Nlc3NJbnRlbnRzIHhtaTppZD0iQXBwbGllZEFjY2Vzc0ludGVudF8xMDcyODI4NzUzNDI0IiBuYW1lPSJjb20uaWJtLndlYnNwaGVyZS5lamJxdWVyeS5EZWZhdWx0IiBkZXNjcmlwdGlvbj0iQWxsIG1ldGhvZHMgb2YgdGhlIEFjY291bnQgYmVhbiBhcmUgc2V0IGZvciByZWFkIG9ubHkuIiBhY2Nlc3NJbnRlbnROYW1lPSJ3c1Blc3NpbWlzdGljUmVhZCI+DQotICAgICAgICA8bWV0aG9kRWxlbWVudHMgeG1pOmlkPSJNZXRob2RFbGVtZW50XzEwNzI4Mjg3NTM0MjQiIHR5cGU9IlVuc3BlY2lmaWVkIj4NCi0gICAgICAgICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQ29udGFpbmVyTWFuYWdlZEVudGl0eV8xIi8+DQotICAgICAgICA8L21ldGhvZEVsZW1lbnRzPg0KLSAgICAgIDwvYXBwbGllZEFjY2Vzc0ludGVudHM+DQotICAgICAgPHRhc2tzIHhtaTppZD0iVGFza18xMDcxMDkzNDE1Nzg0IiBuYW1lPSJnZXRMYXJnZUFjY291bnRzIiBkZXNjcmlwdGlvbj0iVGhpcyB0YXNrIHdpbGwgYmUgdXNlZCBieSBBY2NvdW50TWFuYWdlciBzZXNzaW9uIGJlYW4gZm9yIHJlYWQtb25seSBpbnRlbnQuIi8+DQotICAgIDwvYXBwbGljYXRpb25Qcm9maWxlcz4NCi0gICAgPGVqYkphckV4dGVuc2lvbiBocmVmPSJNRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pI2VqYi1qYXJfSURfRXh0Ii8+DQotICAgIDxkZWZpbmVkQWNjZXNzSW50ZW50UG9saWNpZXMgeG1pOmlkPSJEZWZpbmVkQWNjZXNzSW50ZW50UG9saWN5XzEiIG5hbWU9IlBlc3NpbWlzdGljVXBkYXRlIC0gSW5jcmVtZW50IDEwIiBkZXNjcmlwdGlvbj0iVGhpcyBpcyBhIGN1c3RvbSBwb2xpY3kgdGhhdCBrZWVwcyBhbGwgdGhlIGF0dHJpYnV0ZXMgb2Ygd3NQZXNzaW1pc2l0aWNVcGRhdGUgZXhjZXB0IGZvciBjb2xsZWN0aW9uIGluY3JlbWVudCwgd2hpY2ggaXMgc2V0IHRvIDEwLiI+DQotICAgICAgPGFjY2Vzc0ludGVudEVudHJpZXMgeG1pOnR5cGU9ImVqYmV4dDpQZXNzaW1pc3RpY1VwZGF0ZSIgeG1pOmlkPSJQZXNzaW1pc3RpY1VwZGF0ZV8xMDcyODI0MjkwODE3Ii8+DQotICAgICAgPGFjY2Vzc0ludGVudEVudHJpZXMgeG1pOnR5cGU9ImVqYmV4dDpDb2xsZWN0aW9uSW5jcmVtZW50IiB4bWk6aWQ9IkNvbGxlY3Rpb25JbmNyZW1lbnRfMTA3MjgyNDI5MDgxNyIgY29sbGVjdGlvbkluY3JlbWVudD0iMTAiLz4NCi0gICAgICA8YWNjZXNzSW50ZW50RW50cmllcyB4bWk6dHlwZT0iZWpiZXh0OlJlc291cmNlTWFuYWdlclByZUZldGNoSW5jcmVtZW50IiB4bWk6aWQ9IlJlc291cmNlTWFuYWdlclByZUZldGNoSW5jcmVtZW50XzEwNzI4MjQyOTA4MTciIHByZUZldGNoSW5jcmVtZW50PSIwIi8+DQotICAgICAgPGFjY2Vzc0ludGVudEVudHJpZXMgeG1pOnR5cGU9ImVqYmV4dDpUcmFuc2FjdGlvblNjb3BlIiB4bWk6aWQ9IlRyYW5zYWN0aW9uU2NvcGVfMTA3MjgyNDI5MDgxNyIvPg0KLSAgICA8L2RlZmluZWRBY2Nlc3NJbnRlbnRQb2xpY2llcz4NCi0gICAgPHJ1bkFzVGFza3MgeG1pOmlkPSJSdW5Bc1Rhc2tfMiIgbmFtZT0iZ2V0TGFyZ2VBY291bnRzIj4NCi0gICAgICA8dGFza1J1bkFzS2luZCB4bWk6dHlwZT0iYXBwcHJvZmlsZWVqYmV4dDpSdW5Bc1NwZWNpZmllZFRhc2siIHhtaTppZD0iUnVuQXNTcGVjaWZpZWRUYXNrXzIiPg0KLSAgICAgICAgPHRhc2sgeG1pOmlkPSJUYXNrXzUiIG5hbWU9ImdldExhcmdlQWNjb3VudHMiIGRlc2NyaXB0aW9uPSJmb3Igdmlld2luZyBhY2NvdW50IGRhdGEgb25seSIvPg0KLSAgICAgIDwvdGFza1J1bkFzS2luZD4NCi0gICAgICA8bWV0aG9kRWxlbWVudHMgeG1pOmlkPSJNZXRob2RFbGVtZW50XzMiIG5hbWU9ImdldExhcmdlQWNjb3VudHMiIHBhcm1zPSJkb3VibGUgIiB0eXBlPSJSZW1vdGUiPg0KLSAgICAgICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6U2Vzc2lvbiIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjU2Vzc2lvbl8xIi8+DQotICAgICAgPC9tZXRob2RFbGVtZW50cz4NCi0gICAgPC9ydW5Bc1Rhc2tzPg0KLSAgICA8YXBwUHJvZmlsZUNvbXBvbmVudEV4dGVuc2lvbnMgeG1pOmlkPSJBcHBQcm9maWxlQ29tcG9uZW50RXh0ZW5zaW9uXzEiPg0KLSAgICAgIDxjb21wb25lbnRFeHRlbnNpb24geG1pOnR5cGU9ImVqYmV4dDpTZXNzaW9uRXh0ZW5zaW9uIiBocmVmPSJNRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pI1Nlc3Npb25FeHRlbnNpb25fMSIvPg0KLSAgICA8L2FwcFByb2ZpbGVDb21wb25lbnRFeHRlbnNpb25zPg0KLSAgICA8YXBwUHJvZmlsZUNvbXBvbmVudEV4dGVuc2lvbnMgeG1pOmlkPSJBcHBQcm9maWxlQ29tcG9uZW50RXh0ZW5zaW9uXzIiPg0KLSAgICAgIDxjb21wb25lbnRFeHRlbnNpb24geG1pOnR5cGU9ImVqYmV4dDpDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIiBocmVmPSJNRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pI0NvbnRhaW5lck1hbmFnZWRFbnRpdHlfMV9FeHQiLz4NCi0gICAgPC9hcHBQcm9maWxlQ29tcG9uZW50RXh0ZW5zaW9ucz4NCi0gIDwvYXBwUHJvZmlsZUVKQkphckV4dGVuc2lvbj4NCi08L3BtZWV4dDpQTUVFSkJKYXJFeHRlbnNpb24+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MzI2NGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGVqYmV4dDpFSkJKYXJFeHRlbnNpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplamJleHQ9ImVqYmV4dC54bWkiIHhtbG5zOmVqYj0iZWpiLnhtaSIgeG1pOmlkPSJlamItamFyX0lEX0V4dCI+DQotICA8ZWpiRXh0ZW5zaW9ucyB4bWk6dHlwZT0iZWpiZXh0OkNvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24iIHhtaTppZD0iQ29udGFpbmVyTWFuYWdlZEVudGl0eV8xX0V4dCIgY29uY3VycmVuY3lDb250cm9sPSJwZXNzaW1pc3RpYyI+DQotICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0NvbnRhaW5lck1hbmFnZWRFbnRpdHlfMSIvPg0KLSAgICA8c3RydWN0dXJlIHhtaTppZD0iQmVhblN0cnVjdHVyZV8xIiBpbmhlcml0ZW5jZVJvb3Q9ImZhbHNlIi8+DQotICAgIDxiZWFuQ2FjaGUgeG1pOmlkPSJCZWFuQ2FjaGVfMSIgYWN0aXZhdGVBdD0iVFJBTlNBQ1RJT04iIGxvYWRBdD0iVFJBTlNBQ1RJT04iLz4NCi0gICAgPGxvY2FsVHJhbiB4bWk6aWQ9IkxvY2FsVHJhbl8xIiBib3VuZGFyeT0iQkVBTl9NRVRIT0QiIHVucmVzb2x2ZWRBY3Rpb249IlJPTExCQUNLIi8+DQotICAgIDxkYXRhQ2FjaGUgeG1pOmlkPSJEYXRhQ2FjaGVfMSIgbGlmZXRpbWVJbkNhY2hlPSIwIiBsaWZldGltZUluQ2FjaGVVc2FnZT0iT0ZGIi8+DQotICA8L2VqYkV4dGVuc2lvbnM+DQotICA8ZWpiRXh0ZW5zaW9ucyB4bWk6dHlwZT0iZWpiZXh0OlNlc3Npb25FeHRlbnNpb24iIHhtaTppZD0iU2Vzc2lvbkV4dGVuc2lvbl8xIiB0aW1lb3V0PSI2MDAiPg0KLSAgICA8ZW50ZXJwcmlzZUJlYW4geG1pOnR5cGU9ImVqYjpTZXNzaW9uIiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNTZXNzaW9uXzEiLz4NCi0gICAgPHN0cnVjdHVyZSB4bWk6aWQ9IkJlYW5TdHJ1Y3R1cmVfMiIgaW5oZXJpdGVuY2VSb290PSJmYWxzZSIvPg0KLSAgICA8YmVhbkNhY2hlIHhtaTppZD0iQmVhbkNhY2hlXzIiIGFjdGl2YXRlQXQ9Ik9OQ0UiLz4NCi0gICAgPGxvY2FsVHJhbiB4bWk6aWQ9IkxvY2FsVHJhbl8yIiBib3VuZGFyeT0iQkVBTl9NRVRIT0QiIHVucmVzb2x2ZWRBY3Rpb249IlJPTExCQUNLIi8+DQotICA8L2VqYkV4dGVuc2lvbnM+DQotICA8ZWpiSmFyIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI2VqYi1qYXJfSUQiLz4NCi0gIDxhcHBsaWVkQWNjZXNzSW50ZW50cyB4bWk6aWQ9IkFwcGxpZWRBY2Nlc3NJbnRlbnRfMTA3MTA5MzQxNTc0NCIgbmFtZT0iY29tLmlibS53ZWJzcGhlcmUuZWpicXVlcnkuRGVmYXVsdCIgZGVzY3JpcHRpb249IiIgYWNjZXNzSW50ZW50TmFtZT0iUGVzc2ltaXN0aWNVcGRhdGUgLSBJbmNyZW1lbnQgMTAiPg0KLSAgICA8bWV0aG9kRWxlbWVudHMgeG1pOmlkPSJNZXRob2RFbGVtZW50XzEwNzEwOTM0MTU3NDQiIHR5cGU9IlVuc3BlY2lmaWVkIj4NCi0gICAgICA8ZW50ZXJwcmlzZUJlYW4geG1pOnR5cGU9ImVqYjpDb250YWluZXJNYW5hZ2VkRW50aXR5IiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNDb250YWluZXJNYW5hZ2VkRW50aXR5XzEiLz4NCi0gICAgPC9tZXRob2RFbGVtZW50cz4NCi0gIDwvYXBwbGllZEFjY2Vzc0ludGVudHM+DQotPC9lamJleHQ6RUpCSmFyRXh0ZW5zaW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL01FVEEtSU5GL2VqYi1qYXIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9NRVRBLUlORi9lamItamFyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5M2M4Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL01FVEEtSU5GL2VqYi1qYXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlamItamFyIGlkPSJlamItamFyX0lEIiB2ZXJzaW9uPSIyLjEiIAotCXhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIiA+Ci0JPGRpc3BsYXktbmFtZT4KLQlUZXN0RUpCPC9kaXNwbGF5LW5hbWU+Ci0JPGVudGVycHJpc2UtYmVhbnM+Ci0JCTxzZXNzaW9uIGlkPSJUMSI+Ci0JCQk8ZWpiLW5hbWU+VDE8L2VqYi1uYW1lPgotCQkJPGhvbWU+ZWpicy5UMUhvbWU8L2hvbWU+Ci0JCQk8cmVtb3RlPmVqYnMuVDE8L3JlbW90ZT4KLQkJCTxlamItY2xhc3M+ZWpicy5UMUJlYW48L2VqYi1jbGFzcz4KLQkJCTxzZXNzaW9uLXR5cGU+U3RhdGVsZXNzPC9zZXNzaW9uLXR5cGU+Ci0JCQk8dHJhbnNhY3Rpb24tdHlwZT5Db250YWluZXI8L3RyYW5zYWN0aW9uLXR5cGU+Ci0JCTwvc2Vzc2lvbj4KLQk8L2VudGVycHJpc2UtYmVhbnM+Ci08L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL2VqYnMvVDEuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL2VqYnMvVDEuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYTRlMDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9lamJzL1QxLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9lamJzL1QxQmVhbi5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvZWpicy9UMUJlYW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxY2I0ZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9lamJzL1QxQmVhbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvZWpicy9UMUhvbWUuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL2VqYnMvVDFIb21lLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTc5ODMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvZWpicy9UMUhvbWUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9NRVRBLUlORi9lamItamFyLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvTUVUQS1JTkYvZWpiLWphci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzdhMDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9NRVRBLUlORi9lamItamFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWpiLWphciBpZD0iZWpiLWphcl9JRCIgdmVyc2lvbj0iMi4xIiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIj4KLQk8ZGlzcGxheS1uYW1lPgotCVRlc3RFSkI8L2Rpc3BsYXktbmFtZT4KLQk8ZW50ZXJwcmlzZS1iZWFucz4KLQkJPHNlc3Npb24gaWQ9IlQxIj4KLQkJCTxlamItbmFtZT5UMTwvZWpiLW5hbWU+Ci0JCQk8aG9tZT5lamJzLlQxSG9tZTwvaG9tZT4KLQkJCTxyZW1vdGU+ZWpicy5UMTwvcmVtb3RlPgotCQkJPGVqYi1jbGFzcz5lamJzLlQxQmVhbjwvZWpiLWNsYXNzPgotCQkJPHNlc3Npb24tdHlwZT5TdGF0ZWxlc3M8L3Nlc3Npb24tdHlwZT4KLQkJCTx0cmFuc2FjdGlvbi10eXBlPkNvbnRhaW5lcjwvdHJhbnNhY3Rpb24tdHlwZT4KLQkJPC9zZXNzaW9uPgotCTwvZW50ZXJwcmlzZS1iZWFucz4KLTwvZWpiLWphcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvZWpicy9UMS5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvZWpicy9UMS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhNGUwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL2VqYnMvVDEuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL2VqYnMvVDFCZWFuLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9lamJzL1QxQmVhbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjYjRmNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL2VqYnMvVDFCZWFuLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9lamJzL1QxSG9tZS5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvZWpicy9UMUhvbWUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Nzk4MzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9lamJzL1QxSG9tZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvQW5udWl0eVNlcnZpY2VzX21hcHBpbmcueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi9Bbm51aXR5U2VydmljZXNfbWFwcGluZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZmRjYmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi9Bbm51aXR5U2VydmljZXNfbWFwcGluZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxqYXZhLXdzZGwtbWFwcGluZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgdmVyc2lvbj0iMS4xIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QiPgotICAgIDxwYWNrYWdlLW1hcHBpbmc+Ci0gICAgICAgIDxwYWNrYWdlLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YTwvcGFja2FnZS10eXBlPgotICAgICAgICA8bmFtZXNwYWNlVVJJPmh0dHA6Ly9kYXRhLnBsaS50Yy53c3N2dC5pYm0uY29tPC9uYW1lc3BhY2VVUkk+Ci0gICAgPC9wYWNrYWdlLW1hcHBpbmc+Ci0gICAgPHBhY2thZ2UtbWFwcGluZz4KLSAgICAgICAgPHBhY2thZ2UtdHlwZT5jb20uaWJtLndzc3Z0LmFjbWUuYW5udWl0eS53czwvcGFja2FnZS10eXBlPgotICAgICAgICA8bmFtZXNwYWNlVVJJPmh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbTwvbmFtZXNwYWNlVVJJPgotICAgIDwvcGFja2FnZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+ZG91YmxlPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxyb290LXR5cGUtcW5hbWUgeG1sbnM6cnRxPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+cnRxOmRvdWJsZTwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+c2ltcGxlVHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5qYXZhLnV0aWwuVmVjdG9yPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxyb290LXR5cGUtcW5hbWUgeG1sbnM6cnRxPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiPnJ0cTpWZWN0b3I8L3Jvb3QtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPnNpbXBsZVR5cGU8L3FuYW1lLXNjb3BlPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPnJ0cTpzdHJpbmc8L3Jvb3QtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPnNpbXBsZVR5cGU8L3FuYW1lLXNjb3BlPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxyb290LXR5cGUtcW5hbWUgeG1sbnM6cnRxPSJodHRwOi8vZGF0YS5wbGkudGMud3NzdnQuaWJtLmNvbSI+cnRxOldTQW5udWl0eUNvbXBvc2l0ZURhdGE8L3Jvb3QtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPmNvbXBsZXhUeXBlPC9xbmFtZS1zY29wZT4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPldTQW5udWl0eSAgICBEYXRhPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5XU0FubnVpdHkgICAgRGF0YTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+c3ViQWNjb3VudHM8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPnN1YkFjY291bnRzPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLldTQW5udWl0eURhdGE8L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly9kYXRhLnBsaS50Yy53c3N2dC5pYm0uY29tIj5ydHE6V1NBbm51aXR5RGF0YTwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+Y29tcGxleFR5cGU8L3FuYW1lLXNjb3BlPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+dGF4U3RhdHVzPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT50YXhTdGF0dXM8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnR5cGU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPnR5cGU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmFtb3VudDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+YW1vdW50PC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5lbmREYXRlPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5lbmREYXRlPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5jdXN0TnVtYmVyPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5jdXN0TnVtYmVyPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5jdXN0TmFtZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Y3VzdE5hbWU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmN1c3RTU051bTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Y3VzdFNTTnVtPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5FTWFpbDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+RU1haWw8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmFubnVpdHlObzwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+YW5udWl0eU5vPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5wcmVtaXVtPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5wcmVtaXVtPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5iZWdpbkRhdGU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmJlZ2luRGF0ZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+c3RhdHVzPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5zdGF0dXM8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmZpeGVkUGVyaW9kPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5maXhlZFBlcmlvZDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Zml4ZWRBbW91bnQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmZpeGVkQW1vdW50PC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5saWZlPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5saWZlPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5saWZlV2l0aFBlcmlvZDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+bGlmZVdpdGhQZXJpb2Q8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmZpeGVkUGVyY2VudDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Zml4ZWRQZXJjZW50PC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5hY3R1YWxQZXJjZW50PC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5hY3R1YWxQZXJjZW50PC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5iZW5lZml0T3B0aW9uczwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+YmVuZWZpdE9wdGlvbnM8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnByZW1pdW1TY2hlZDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+cHJlbWl1bVNjaGVkPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5pbnZlc3RDYXRlZ29yeTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+aW52ZXN0Q2F0ZWdvcnk8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnBheW91dE9wdGlvbnM8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPnBheW91dE9wdGlvbnM8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmd1YXJQYXlvdXQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmd1YXJQYXlvdXQ8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPm51bVN1YkFjY3RzPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5udW1TdWJBY2N0czwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+ZXh0cmFDcmVkaXRzPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5leHRyYUNyZWRpdHM8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmNlbGxOb2RlU2VydmVyTmFtZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Y2VsbE5vZGVTZXJ2ZXJOYW1lPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5jbGllbnRJZDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Y2xpZW50SWQ8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmludDwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPnJ0cTppbnQ8L3Jvb3QtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPnNpbXBsZVR5cGU8L3FuYW1lLXNjb3BlPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+amF2YS51dGlsLkNhbGVuZGFyPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxyb290LXR5cGUtcW5hbWUgeG1sbnM6cnRxPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+cnRxOmRhdGVUaW1lPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5zaW1wbGVUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuU3ViQWNjdERhdGFbXTwvamF2YS10eXBlPgotICAgICAgICA8YW5vbnltb3VzLXR5cGUtcW5hbWU+aHR0cDovL2RhdGEucGxpLnRjLndzc3Z0LmlibS5jb206U3ViQWNjdERhdGFbMCx1bmJvdW5kZWRdPC9hbm9ueW1vdXMtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPmNvbXBsZXhUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuU3ViQWNjdERhdGE8L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly9kYXRhLnBsaS50Yy53c3N2dC5pYm0uY29tIj5ydHE6U3ViQWNjdERhdGE8L3Jvb3QtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPmNvbXBsZXhUeXBlPC9xbmFtZS1zY29wZT4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnR5cGU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPnR5cGU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnZhbHVlPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT52YWx1ZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+YW5udWl0eUlkPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5hbm51aXR5SWQ8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmlkPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5pZDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+bmFtZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+bmFtZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Y2VsbE5vZGVTZXJ2ZXJOYW1lPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5jZWxsTm9kZVNlcnZlck5hbWU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmNsaWVudElkPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5jbGllbnRJZDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+Ym9vbGVhbjwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPnJ0cTpib29sZWFuPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5zaW1wbGVUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuU3ViQWNjdERhdGFbXTwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5ydHE6QXJyYXlPZl90bnMyX25pbGxhYmxlX1N1YkFjY3REYXRhPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5jb21wbGV4VHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5zdWJBY2N0RGF0YTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+U3ViQWNjdERhdGE8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuU3ViQWNjdERhdGFbXTwvamF2YS10eXBlPgotICAgICAgICA8YW5vbnltb3VzLXR5cGUtcW5hbWU+aHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tOkFycmF5T2ZfdG5zMl9uaWxsYWJsZV9TdWJBY2N0RGF0YSZndDtTdWJBY2N0RGF0YVswLHVuYm91bmRlZF08L2Fub255bW91cy10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+Y29tcGxleFR5cGU8L3FuYW1lLXNjb3BlPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+amF2YS5sYW5nLk9iamVjdFtdPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxhbm9ueW1vdXMtdHlwZS1xbmFtZT5odHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXA6VmVjdG9yJmd0O2l0ZW1bMCx1bmJvdW5kZWRdPC9hbm9ueW1vdXMtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPmNvbXBsZXhUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8c2VydmljZS1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtaW50ZXJmYWNlPmNvbS5pYm0ud3NzdnQuYWNtZS5hbm51aXR5LndzLldTVEFubnVpdHlTZXJ2aWNlPC9zZXJ2aWNlLWludGVyZmFjZT4KLSAgICAgICAgPHdzZGwtc2VydmljZS1uYW1lIHhtbG5zOnNpbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5zaW06V1NUQW5udWl0eVNlcnZpY2U8L3dzZGwtc2VydmljZS1uYW1lPgotICAgICAgICA8cG9ydC1tYXBwaW5nPgotICAgICAgICAgICAgPHBvcnQtbmFtZT5XU1RBbm51aXR5U2VydmljZTwvcG9ydC1uYW1lPgotICAgICAgICAgICAgPGphdmEtcG9ydC1uYW1lPldTVEFubnVpdHlTZXJ2aWNlPC9qYXZhLXBvcnQtbmFtZT4KLSAgICAgICAgPC9wb3J0LW1hcHBpbmc+Ci0gICAgPC9zZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nPgotICAgIDxzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nPgotICAgICAgICA8c2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2U+Y29tLmlibS53c3N2dC5hY21lLmFubnVpdHkud3MuQW5udWl0eVNlcnZpY2VQb3J0VHlwZTwvc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2U+Ci0gICAgICAgIDx3c2RsLXBvcnQtdHlwZSB4bWxuczpzZWltd3B0PSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPnNlaW13cHQ6QW5udWl0eVNlcnZpY2VQb3J0VHlwZTwvd3NkbC1wb3J0LXR5cGU+Ci0gICAgICAgIDx3c2RsLWJpbmRpbmcgeG1sbnM6c2VpbXdiPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPnNlaW13YjpBbm51aXR5U2VydmljZUJpbmRpbmc8L3dzZGwtYmluZGluZz4KLSAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS1tZXRob2QtbmFtZT53c0xpc3RBbm51aXR5QnlIb2xkZXI8L2phdmEtbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8d3NkbC1vcGVyYXRpb24+d3NMaXN0QW5udWl0eUJ5SG9sZGVyPC93c2RsLW9wZXJhdGlvbj4KLSAgICAgICAgICAgIDx3cmFwcGVkLWVsZW1lbnQ+PC93cmFwcGVkLWVsZW1lbnQ+Ci0gICAgICAgICAgICA8bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXBvc2l0aW9uPjA8L3BhcmFtLXBvc2l0aW9uPgotICAgICAgICAgICAgICAgIDxwYXJhbS10eXBlPmphdmEubGFuZy5TdHJpbmc8L3BhcmFtLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOm1wcG09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+bXBwbTp3c0xpc3RBbm51aXR5QnlIb2xkZXJSZXF1ZXN0PC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPmhvbGRlclNTTjwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHBhcmFtZXRlci1tb2RlPklOPC9wYXJhbWV0ZXItbW9kZT4KLSAgICAgICAgICAgICAgICA8L3dzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgPC9tZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgIDx3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcmV0dXJuLXZhbHVlPmphdmEudXRpbC5WZWN0b3I8L21ldGhvZC1yZXR1cm4tdmFsdWU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczp3cnZtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPndydm06d3NMaXN0QW5udWl0eUJ5SG9sZGVyUmVzcG9uc2U8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT53c0xpc3RBbm51aXR5QnlIb2xkZXJSZXR1cm48L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICA8L3dzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgIDwvc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS1tZXRob2QtbmFtZT53c0FkZFN1YkFjY291bnRzPC9qYXZhLW1ldGhvZC1uYW1lPgotICAgICAgICAgICAgPHdzZGwtb3BlcmF0aW9uPndzQWRkU3ViQWNjb3VudHM8L3dzZGwtb3BlcmF0aW9uPgotICAgICAgICAgICAgPHdyYXBwZWQtZWxlbWVudD48L3dyYXBwZWQtZWxlbWVudD4KLSAgICAgICAgICAgIDxtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8cGFyYW0tcG9zaXRpb24+MDwvcGFyYW0tcG9zaXRpb24+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9wYXJhbS10eXBlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczptcHBtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPm1wcG06d3NBZGRTdWJBY2NvdW50c1JlcXVlc3Q8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+YUNEPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW1ldGVyLW1vZGU+SU48L3BhcmFtZXRlci1tb2RlPgotICAgICAgICAgICAgICAgIDwvd3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8L21ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgPG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxwYXJhbS1wb3NpdGlvbj4xPC9wYXJhbS1wb3NpdGlvbj4KLSAgICAgICAgICAgICAgICA8cGFyYW0tdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLlN1YkFjY3REYXRhW108L3BhcmFtLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOm1wcG09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+bXBwbTp3c0FkZFN1YkFjY291bnRzUmVxdWVzdDwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT5zQUQ8L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXItbW9kZT5JTjwvcGFyYW1ldGVyLW1vZGU+Ci0gICAgICAgICAgICAgICAgPC93c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICA8d3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXJldHVybi12YWx1ZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLldTQW5udWl0eUNvbXBvc2l0ZURhdGE8L21ldGhvZC1yZXR1cm4tdmFsdWU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczp3cnZtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPndydm06d3NBZGRTdWJBY2NvdW50c1Jlc3BvbnNlPC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+d3NBZGRTdWJBY2NvdW50c1JldHVybjwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgIDwvd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgPC9zZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICA8c2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLW1ldGhvZC1uYW1lPndzQ3JlYXRlQW5udWl0eTwvamF2YS1tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDx3c2RsLW9wZXJhdGlvbj53c0NyZWF0ZUFubnVpdHk8L3dzZGwtb3BlcmF0aW9uPgotICAgICAgICAgICAgPHdyYXBwZWQtZWxlbWVudD48L3dyYXBwZWQtZWxlbWVudD4KLSAgICAgICAgICAgIDxtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8cGFyYW0tcG9zaXRpb24+MDwvcGFyYW0tcG9zaXRpb24+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9wYXJhbS10eXBlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczptcHBtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPm1wcG06d3NDcmVhdGVBbm51aXR5UmVxdWVzdDwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT5hQ0Q8L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXItbW9kZT5JTjwvcGFyYW1ldGVyLW1vZGU+Ci0gICAgICAgICAgICAgICAgPC93c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICA8d3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXJldHVybi12YWx1ZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLldTQW5udWl0eUNvbXBvc2l0ZURhdGE8L21ldGhvZC1yZXR1cm4tdmFsdWU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczp3cnZtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPndydm06d3NDcmVhdGVBbm51aXR5UmVzcG9uc2U8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT53c0NyZWF0ZUFubnVpdHlSZXR1cm48L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICA8L3dzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgIDwvc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICA8L3NlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmc+Ci0gICAgPHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWludGVyZmFjZT5jb20uaWJtLndzc3Z0LmFjbWUuYW5udWl0eS53cy5Bbm51aXR5U2VydmljZTwvc2VydmljZS1pbnRlcmZhY2U+Ci0gICAgICAgIDx3c2RsLXNlcnZpY2UtbmFtZSB4bWxuczpzaW09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+c2ltOkFubnVpdHlTZXJ2aWNlPC93c2RsLXNlcnZpY2UtbmFtZT4KLSAgICAgICAgPHBvcnQtbWFwcGluZz4KLSAgICAgICAgICAgIDxwb3J0LW5hbWU+QW5udWl0eVNlcnZpY2U8L3BvcnQtbmFtZT4KLSAgICAgICAgICAgIDxqYXZhLXBvcnQtbmFtZT5Bbm51aXR5U2VydmljZTwvamF2YS1wb3J0LW5hbWU+Ci0gICAgICAgIDwvcG9ydC1tYXBwaW5nPgotICAgIDwvc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICA8c2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlPmNvbS5pYm0ud3NzdnQuYWNtZS5hbm51aXR5LndzLkFubnVpdHlTZXJ2aWNlUG9ydFR5cGU8L3NlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlPgotICAgICAgICA8d3NkbC1wb3J0LXR5cGUgeG1sbnM6c2VpbXdwdD0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5zZWltd3B0OkFubnVpdHlTZXJ2aWNlUG9ydFR5cGU8L3dzZGwtcG9ydC10eXBlPgotICAgICAgICA8d3NkbC1iaW5kaW5nIHhtbG5zOnNlaW13Yj0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5zZWltd2I6QW5udWl0eVNlcnZpY2VCaW5kaW5nPC93c2RsLWJpbmRpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtbWV0aG9kLW5hbWU+d3NMaXN0QW5udWl0eUJ5SG9sZGVyPC9qYXZhLW1ldGhvZC1uYW1lPgotICAgICAgICAgICAgPHdzZGwtb3BlcmF0aW9uPndzTGlzdEFubnVpdHlCeUhvbGRlcjwvd3NkbC1vcGVyYXRpb24+Ci0gICAgICAgICAgICA8d3JhcHBlZC1lbGVtZW50Pjwvd3JhcHBlZC1lbGVtZW50PgotICAgICAgICAgICAgPG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxwYXJhbS1wb3NpdGlvbj4wPC9wYXJhbS1wb3NpdGlvbj4KLSAgICAgICAgICAgICAgICA8cGFyYW0tdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9wYXJhbS10eXBlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczptcHBtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPm1wcG06d3NMaXN0QW5udWl0eUJ5SG9sZGVyUmVxdWVzdDwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT5ob2xkZXJTU048L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXItbW9kZT5JTjwvcGFyYW1ldGVyLW1vZGU+Ci0gICAgICAgICAgICAgICAgPC93c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICA8d3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXJldHVybi12YWx1ZT5qYXZhLnV0aWwuVmVjdG9yPC9tZXRob2QtcmV0dXJuLXZhbHVlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6d3J2bT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj53cnZtOndzTGlzdEFubnVpdHlCeUhvbGRlclJlc3BvbnNlPC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+d3NMaXN0QW5udWl0eUJ5SG9sZGVyUmV0dXJuPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgPC93c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICA8L3NlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtbWV0aG9kLW5hbWU+d3NBZGRTdWJBY2NvdW50czwvamF2YS1tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDx3c2RsLW9wZXJhdGlvbj53c0FkZFN1YkFjY291bnRzPC93c2RsLW9wZXJhdGlvbj4KLSAgICAgICAgICAgIDx3cmFwcGVkLWVsZW1lbnQ+PC93cmFwcGVkLWVsZW1lbnQ+Ci0gICAgICAgICAgICA8bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXBvc2l0aW9uPjA8L3BhcmFtLXBvc2l0aW9uPgotICAgICAgICAgICAgICAgIDxwYXJhbS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvcGFyYW0tdHlwZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6bXBwbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5tcHBtOndzQWRkU3ViQWNjb3VudHNSZXF1ZXN0PC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPmFDRDwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHBhcmFtZXRlci1tb2RlPklOPC9wYXJhbWV0ZXItbW9kZT4KLSAgICAgICAgICAgICAgICA8L3dzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgPC9tZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgIDxtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8cGFyYW0tcG9zaXRpb24+MTwvcGFyYW0tcG9zaXRpb24+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5TdWJBY2N0RGF0YVtdPC9wYXJhbS10eXBlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczptcHBtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPm1wcG06d3NBZGRTdWJBY2NvdW50c1JlcXVlc3Q8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+c0FEPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW1ldGVyLW1vZGU+SU48L3BhcmFtZXRlci1tb2RlPgotICAgICAgICAgICAgICAgIDwvd3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8L21ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgPHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1yZXR1cm4tdmFsdWU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9tZXRob2QtcmV0dXJuLXZhbHVlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6d3J2bT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj53cnZtOndzQWRkU3ViQWNjb3VudHNSZXNwb25zZTwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPndzQWRkU3ViQWNjb3VudHNSZXR1cm48L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICA8L3dzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgIDwvc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS1tZXRob2QtbmFtZT53c0NyZWF0ZUFubnVpdHk8L2phdmEtbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8d3NkbC1vcGVyYXRpb24+d3NDcmVhdGVBbm51aXR5PC93c2RsLW9wZXJhdGlvbj4KLSAgICAgICAgICAgIDx3cmFwcGVkLWVsZW1lbnQ+PC93cmFwcGVkLWVsZW1lbnQ+Ci0gICAgICAgICAgICA8bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXBvc2l0aW9uPjA8L3BhcmFtLXBvc2l0aW9uPgotICAgICAgICAgICAgICAgIDxwYXJhbS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvcGFyYW0tdHlwZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6bXBwbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5tcHBtOndzQ3JlYXRlQW5udWl0eVJlcXVlc3Q8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+YUNEPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW1ldGVyLW1vZGU+SU48L3BhcmFtZXRlci1tb2RlPgotICAgICAgICAgICAgICAgIDwvd3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8L21ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgPHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1yZXR1cm4tdmFsdWU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9tZXRob2QtcmV0dXJuLXZhbHVlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6d3J2bT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj53cnZtOndzQ3JlYXRlQW5udWl0eVJlc3BvbnNlPC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+d3NDcmVhdGVBbm51aXR5UmV0dXJuPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgPC93c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICA8L3NlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgPC9zZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nPgotICAgIDxzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nPgotICAgICAgICA8c2VydmljZS1pbnRlcmZhY2U+Y29tLmlibS53c3N2dC5hY21lLmFubnVpdHkud3MuQW5udWl0eVNlcnZpY2UyPC9zZXJ2aWNlLWludGVyZmFjZT4KLSAgICAgICAgPHdzZGwtc2VydmljZS1uYW1lIHhtbG5zOnNpbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5zaW06QW5udWl0eVNlcnZpY2UyPC93c2RsLXNlcnZpY2UtbmFtZT4KLSAgICAgICAgPHBvcnQtbWFwcGluZz4KLSAgICAgICAgICAgIDxwb3J0LW5hbWU+QW5udWl0eVNlcnZpY2UyPC9wb3J0LW5hbWU+Ci0gICAgICAgICAgICA8amF2YS1wb3J0LW5hbWU+QW5udWl0eVNlcnZpY2UyPC9qYXZhLXBvcnQtbmFtZT4KLSAgICAgICAgPC9wb3J0LW1hcHBpbmc+Ci0gICAgPC9zZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nPgotICAgIDxzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nPgotICAgICAgICA8c2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2U+Y29tLmlibS53c3N2dC5hY21lLmFubnVpdHkud3MuQW5udWl0eVNlcnZpY2VQb3J0VHlwZTwvc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2U+Ci0gICAgICAgIDx3c2RsLXBvcnQtdHlwZSB4bWxuczpzZWltd3B0PSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPnNlaW13cHQ6QW5udWl0eVNlcnZpY2VQb3J0VHlwZTwvd3NkbC1wb3J0LXR5cGU+Ci0gICAgICAgIDx3c2RsLWJpbmRpbmcgeG1sbnM6c2VpbXdiPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPnNlaW13YjpBbm51aXR5U2VydmljZUJpbmRpbmc8L3dzZGwtYmluZGluZz4KLSAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS1tZXRob2QtbmFtZT53c0xpc3RBbm51aXR5QnlIb2xkZXI8L2phdmEtbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8d3NkbC1vcGVyYXRpb24+d3NMaXN0QW5udWl0eUJ5SG9sZGVyPC93c2RsLW9wZXJhdGlvbj4KLSAgICAgICAgICAgIDx3cmFwcGVkLWVsZW1lbnQ+PC93cmFwcGVkLWVsZW1lbnQ+Ci0gICAgICAgICAgICA8bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXBvc2l0aW9uPjA8L3BhcmFtLXBvc2l0aW9uPgotICAgICAgICAgICAgICAgIDxwYXJhbS10eXBlPmphdmEubGFuZy5TdHJpbmc8L3BhcmFtLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOm1wcG09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+bXBwbTp3c0xpc3RBbm51aXR5QnlIb2xkZXJSZXF1ZXN0PC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPmhvbGRlclNTTjwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHBhcmFtZXRlci1tb2RlPklOPC9wYXJhbWV0ZXItbW9kZT4KLSAgICAgICAgICAgICAgICA8L3dzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgPC9tZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgIDx3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcmV0dXJuLXZhbHVlPmphdmEudXRpbC5WZWN0b3I8L21ldGhvZC1yZXR1cm4tdmFsdWU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczp3cnZtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPndydm06d3NMaXN0QW5udWl0eUJ5SG9sZGVyUmVzcG9uc2U8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT53c0xpc3RBbm51aXR5QnlIb2xkZXJSZXR1cm48L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICA8L3dzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgIDwvc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS1tZXRob2QtbmFtZT53c0FkZFN1YkFjY291bnRzPC9qYXZhLW1ldGhvZC1uYW1lPgotICAgICAgICAgICAgPHdzZGwtb3BlcmF0aW9uPndzQWRkU3ViQWNjb3VudHM8L3dzZGwtb3BlcmF0aW9uPgotICAgICAgICAgICAgPHdyYXBwZWQtZWxlbWVudD48L3dyYXBwZWQtZWxlbWVudD4KLSAgICAgICAgICAgIDxtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8cGFyYW0tcG9zaXRpb24+MDwvcGFyYW0tcG9zaXRpb24+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9wYXJhbS10eXBlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczptcHBtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPm1wcG06d3NBZGRTdWJBY2NvdW50c1JlcXVlc3Q8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+YUNEPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW1ldGVyLW1vZGU+SU48L3BhcmFtZXRlci1tb2RlPgotICAgICAgICAgICAgICAgIDwvd3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8L21ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgPG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxwYXJhbS1wb3NpdGlvbj4xPC9wYXJhbS1wb3NpdGlvbj4KLSAgICAgICAgICAgICAgICA8cGFyYW0tdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLlN1YkFjY3REYXRhW108L3BhcmFtLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOm1wcG09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+bXBwbTp3c0FkZFN1YkFjY291bnRzUmVxdWVzdDwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT5zQUQ8L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXItbW9kZT5JTjwvcGFyYW1ldGVyLW1vZGU+Ci0gICAgICAgICAgICAgICAgPC93c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICA8d3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXJldHVybi12YWx1ZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLldTQW5udWl0eUNvbXBvc2l0ZURhdGE8L21ldGhvZC1yZXR1cm4tdmFsdWU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczp3cnZtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPndydm06d3NBZGRTdWJBY2NvdW50c1Jlc3BvbnNlPC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+d3NBZGRTdWJBY2NvdW50c1JldHVybjwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgIDwvd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgPC9zZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICA8c2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLW1ldGhvZC1uYW1lPndzQ3JlYXRlQW5udWl0eTwvamF2YS1tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDx3c2RsLW9wZXJhdGlvbj53c0NyZWF0ZUFubnVpdHk8L3dzZGwtb3BlcmF0aW9uPgotICAgICAgICAgICAgPHdyYXBwZWQtZWxlbWVudD48L3dyYXBwZWQtZWxlbWVudD4KLSAgICAgICAgICAgIDxtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8cGFyYW0tcG9zaXRpb24+MDwvcGFyYW0tcG9zaXRpb24+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9wYXJhbS10eXBlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczptcHBtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPm1wcG06d3NDcmVhdGVBbm51aXR5UmVxdWVzdDwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT5hQ0Q8L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXItbW9kZT5JTjwvcGFyYW1ldGVyLW1vZGU+Ci0gICAgICAgICAgICAgICAgPC93c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICA8d3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXJldHVybi12YWx1ZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLldTQW5udWl0eUNvbXBvc2l0ZURhdGE8L21ldGhvZC1yZXR1cm4tdmFsdWU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczp3cnZtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPndydm06d3NDcmVhdGVBbm51aXR5UmVzcG9uc2U8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT53c0NyZWF0ZUFubnVpdHlSZXR1cm48L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICA8L3dzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgIDwvc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICA8L3NlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmc+Ci08L2phdmEtd3NkbC1tYXBwaW5nPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi9pYm0td2Vic2VydmljZXMtYm5kLnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvaWJtLXdlYnNlcnZpY2VzLWJuZC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGNmNmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi9pYm0td2Vic2VydmljZXMtYm5kLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLndzYm5kOldTQmluZGluZyB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmNvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2Uud3NibmQ9Imh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzcGhlcmUvYXBwc2VydmVyL3NjaGVtYXMvNS4wLjIvd3NibmQueG1pIiB4bWk6aWQ9IldTQmluZGluZ18xMDU1NzM3MjQxNzk3Ij4KLSAgPHdzZGVzY0JpbmRpbmdzIHhtaTppZD0iV1NEZXNjQmluZGluZ18xMDU1NzM3MjQxNzk3IiB3c0Rlc2NOYW1lTGluaz0iU3RvY2tRdW90ZUZldGNoZXIiPgotICAgIDxwY0JpbmRpbmdzIHhtaTppZD0iUENCaW5kaW5nXzEwNTU3MzcyNDE3OTciIHBjTmFtZUxpbms9InVybjp4bWx0b2RheS1kZWxheWVkLXF1b3RlcyIgc2NvcGU9IlNlc3Npb24iLz4KLSAgPC93c2Rlc2NCaW5kaW5ncz4KLSAgPHJvdXRlck1vZHVsZXMgeG1pOmlkPSJSb3V0ZXJNb2R1bGVfMTA1NTczNzI0MTc5NyIgdHJhbnNwb3J0PSJodHRwIiBuYW1lPSJTdG9ja1F1b3RlLndhciIvPgotPC9jb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLndzYm5kOldTQmluZGluZz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvaWJtLXdlYnNlcnZpY2VzLWV4dC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL2libS13ZWJzZXJ2aWNlcy1leHQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA1MDBmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvaWJtLXdlYnNlcnZpY2VzLWV4dC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxjb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLndzZXh0OldzRXh0ZW5zaW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6Y29tLmlibS5ldG9vbHMud2Vic2VydmljZS53c2V4dD0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNwaGVyZS9hcHBzZXJ2ZXIvc2NoZW1hcy81LjAuMi93c2V4dC54bWkiIHhtaTppZD0iV3NFeHRlbnNpb25fMTA1MzQ4NDYxNTA1NCI+Ci0gIDx3c0Rlc2NFeHQgeG1pOmlkPSJXc0Rlc2NFeHRfMTA1MzQ4NDYxNTA1NCIgd3NEZXNjTmFtZUxpbms9IlN0b2NrUXVvdGVGZXRjaGVyIj4KLSAgICA8cGNCaW5kaW5nIHhtaTppZD0iUGNCaW5kaW5nXzEwNTM0ODQ2MTUwNTQiIHBjTmFtZUxpbms9InVybjp4bWx0b2RheS1kZWxheWVkLXF1b3RlcyI+Ci0gICAgPC9wY0JpbmRpbmc+Ci0gIDwvd3NEZXNjRXh0PgotPC9jb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLndzZXh0OldzRXh0ZW5zaW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL3dlYnNlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2OTA3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL3dlYnNlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgd2Vic2VydmljZXMgUFVCTElDICItLy9JQk0gQ29ycG9yYXRpb24sIEluYy4vL0RURCBKMkVFIFdlYiBzZXJ2aWNlcyAxLjAvL0VOIiAiaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL2R0ZC9qMmVlX3dlYl9zZXJ2aWNlc18xXzAuZHRkIj4KLQotICAgPHdlYnNlcnZpY2VzIGlkPSJXZWJTZXJ2aWNlc18xMDU1NzM3MjQxNjcyIj4KLSAgICAgIDx3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIGlkPSJXZWJTZXJ2aWNlRGVzY3JpcHRpb25fMTA1NTczNzI0MTY4OCI+Ci0gICAgICAgICA8d2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lPlN0b2NrUXVvdGVGZXRjaGVyPC93ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWU+Ci0gICAgICAgICA8d3NkbC1maWxlPk1FVEEtSU5GL3dzZGwvU3RvY2tRdW90ZUZldGNoZXIud3NkbDwvd3NkbC1maWxlPgotICAgICAgICAgPGpheHJwYy1tYXBwaW5nLWZpbGU+TUVUQS1JTkYvU3RvY2tRdW90ZUZldGNoZXJfbWFwcGluZy54bWw8L2pheHJwYy1tYXBwaW5nLWZpbGU+Ci0gICAgICAgICA8cG9ydC1jb21wb25lbnQgaWQ9IlBvcnRDb21wb25lbnRfMTA1NTczNzI0MTczNCI+Ci0gICAgICAgICAgICA8cG9ydC1jb21wb25lbnQtbmFtZT51cm46eG1sdG9kYXktZGVsYXllZC1xdW90ZXM8L3BvcnQtY29tcG9uZW50LW5hbWU+Ci0gICAgICAgICAgICA8d3NkbC1wb3J0IGlkPSJXU0RMUG9ydF8xMDU1NzM3MjQxNzM0Ij4KLSAgICAgICAgICAgICAgIDxuYW1lc3BhY2VVUkk+aHR0cDovL3N0b2NrLndlYnNlcnZpY2VzLnNhbXBsZXMud2Vic3BoZXJlLmlibS5jb208L25hbWVzcGFjZVVSST4KLSAgICAgICAgICAgICAgIDxsb2NhbHBhcnQ+U3RvY2tRdW90ZTwvbG9jYWxwYXJ0PgotICAgICAgICAgICAgPC93c2RsLXBvcnQ+Ci0gICAgICAgICAgICA8c2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2U+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy53ZWJzZXJ2aWNlcy5zdG9jay5TdG9ja1F1b3RlPC9zZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZT4KLSAgICAgICAgICAgIDxzZXJ2aWNlLWltcGwtYmVhbiBpZD0iU2VydmljZUltcGxCZWFuXzEwNTU3MzcyNDE3MzQiPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmNvbV9pYm1fd2Vic3BoZXJlX3NhbXBsZXNfd2Vic2VydmljZXNfc3RvY2tfU3RvY2tRdW90ZTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L3NlcnZpY2UtaW1wbC1iZWFuPgotICAgICAgICAgPC9wb3J0LWNvbXBvbmVudD4KLSAgICAgIDwvd2Vic2VydmljZS1kZXNjcmlwdGlvbj4KLSAgIDwvd2Vic2VydmljZXM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmNjcwZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb24vIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2FjNjA2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotcGVyZm9ybWFuY2UuamFyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWVkMzNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDQ1NDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLnBlcmZvcm1hbmNlLmphciA9IGNvbW1vbi8KLW91dHB1dC5wZXJmb3JtYW5jZS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvQmFzZVBlcmZvcm1hbmNlVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9CYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc1NmFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9CYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIERlYyA2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQmFzZVRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZSBleHRlbmRzIEJhc2VUZXN0Q2FzZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgcGVyZm9ybWFuY2VDbGFzcyA9IG51bGw7Ci0Jc3RhdGljIENsYXNzTG9hZGVyIGNsYXp6TG9hZGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmaWxlPSBudWxsOyAKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXBlcmZvcm1hbmNlQ2xhc3MgPSBudWxsOwotCQlyZXR1cm4gY3JlYXRlVGVzdFN1aXRlcygpIDsKLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVGVzdCBjcmVhdGVUZXN0U3VpdGVzKCkgewotCQljcmVhdGVQZXJmb3JtYW5jZUNsYXNzKCk7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGVyZm9ybWFuY2VDbGFzcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNsYXNzIGNsYXp6ID0gKENsYXNzKSBpdGVyLm5leHQoKTsKLQkJCUxpc3QgbWV0aG9kTGlzdCA9IChMaXN0KXBlcmZvcm1hbmNlQ2xhc3MuZ2V0KGNsYXp6KTsKLQkJCWZvciAoaW50IHg9MDsgeDwgbWV0aG9kTGlzdC5zaXplKCk7ICsreCkgewotCQkJCVBlcmZvcm1hbmNlVGVzdE9iamVjdCB0ZXN0T2JqZWN0ID0gKFBlcmZvcm1hbmNlVGVzdE9iamVjdCltZXRob2RMaXN0LmdldCh4KTsKLQkJCQlUZXN0IHRlc3QgPSBjcmVhdGVUZXN0KGNsYXp6LHRlc3RPYmplY3QuZ2V0TmFtZSgpKTsKLQkJCQlpZiAodGVzdCBpbnN0YW5jZW9mIEJhc2VUZXN0Q2FzZSkgewotCQkJCQlzdWl0ZS5hZGRUZXN0KG5ldyBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlcigoQmFzZVRlc3RDYXNlKXRlc3QsIHRlc3RPYmplY3QuZ2V0VGFnZ2luZygpICwgdGVzdE9iamVjdC5nZXRTaG9ydE5hbWUoKSkpOwotCQkJCX0KLQkJCX0KLQkJfQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyBUZXN0IGNyZWF0ZVRlc3QoQ2xhc3MgdGhlQ2xhc3MsIFN0cmluZyBuYW1lKSB7Ci0JCUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yOwotCQl0cnkgewotCQkJY29uc3RydWN0b3I9IGdldFRlc3RDb25zdHJ1Y3Rvcih0aGVDbGFzcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gd2FybmluZygiQ2xhc3MgIit0aGVDbGFzcy5nZXROYW1lKCkrIiBoYXMgbm8gcHVibGljIGNvbnN0cnVjdG9yIFRlc3RDYXNlKFN0cmluZyBuYW1lKSBvciBUZXN0Q2FzZSgpIik7Ci0JCX0KLQkJT2JqZWN0IHRlc3Q7Ci0JCXRyeSB7Ci0JCQlpZiAoY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMCkgewotCQkJCXRlc3Q9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbMF0pOwotCQkJCWlmICh0ZXN0IGluc3RhbmNlb2YgVGVzdENhc2UpCi0JCQkJCSgoVGVzdENhc2UpIHRlc3QpLnNldE5hbWUobmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCXRlc3Q9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtuYW1lfSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuKHdhcm5pbmcoIkNhbm5vdCBpbnN0YW50aWF0ZSB0ZXN0IGNhc2U6ICIrbmFtZSsiICgiK2V4Y2VwdGlvblRvU3RyaW5nKGUpKyIpIikpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybih3YXJuaW5nKCJFeGNlcHRpb24gaW4gY29uc3RydWN0b3I6ICIrbmFtZSsiICgiK2V4Y2VwdGlvblRvU3RyaW5nKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpKyIpIikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybih3YXJuaW5nKCJDYW5ub3QgYWNjZXNzIHRlc3QgY2FzZTogIituYW1lKyIgKCIrZXhjZXB0aW9uVG9TdHJpbmcoZSkrIikiKSk7Ci0JCX0KLQkJcmV0dXJuIChUZXN0KSB0ZXN0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgdGVzdCB3aGljaCB3aWxsIGZhaWwgYW5kIGxvZyBhIHdhcm5pbmcgbWVzc2FnZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBUZXN0IHdhcm5pbmcoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBUZXN0Q2FzZSgid2FybmluZyIpIHsKLQkJCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7Ci0JCQkJZmFpbChtZXNzYWdlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb25zdHJ1Y3RvciBnZXRUZXN0Q29uc3RydWN0b3IoQ2xhc3MgdGhlQ2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlDbGFzc1tdIGFyZ3M9IHsgU3RyaW5nLmNsYXNzIH07Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhlQ2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJncyk7CQotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJLy8gZmFsbCB0aHJvdWdoCi0JCX0KLQkJcmV0dXJuIHRoZUNsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1swXSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBleGNlcHRpb25Ub1N0cmluZyhUaHJvd2FibGUgdCkgewotCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHdyaXRlcj0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7Ci0JCXQucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7Ci0JCXJldHVybiBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLQotCX0KLQkvKioKLQkgKiBAcGFyYW0gcGVyZm9ybWFuY2VDbGFzczIKLQkgKi8KLQkKLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRQZXJmb3JtYW5jZUNsYXNzKCkgewotCQlpZiAocGVyZm9ybWFuY2VDbGFzcyA9PSBudWxsKSB7Ci0JCQljcmVhdGVQZXJmb3JtYW5jZUNsYXNzKCk7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1hbmNlQ2xhc3M7Ci0JfQotCQotCQkKLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY3JlYXRlUGVyZm9ybWFuY2VDbGFzcygpIHsKLQkJaWYgKHBlcmZvcm1hbmNlQ2xhc3MgPT0gbnVsbCkgewotCQkJcGVyZm9ybWFuY2VDbGFzcyA9IG5ldyBUZXN0Q2FzZVNBWFBhcnNlcigpLmRvTG9hZChuZXcgRmlsZShmaWxlKSk7Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsYXp6TG9hZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBjbGF6ekxvYWRlcjsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGNsYXp6TG9hZGVyIFRoZSBjbGF6ekxvYWRlciB0byBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXp6TG9hZGVyKSB7Ci0JCUJhc2VQZXJmb3JtYW5jZVRlc3RDYXNlLmNsYXp6TG9hZGVyID0gY2xhenpMb2FkZXI7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlKCkgewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWxlKFN0cmluZyBmaWxlKSB7Ci0JCUJhc2VQZXJmb3JtYW5jZVRlc3RDYXNlLmZpbGUgPSBmaWxlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc3VpdGUKLQkgKiBAcGFyYW0gdGVzdAotCSAqIEBwYXJhbSBnbG9iYWwKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZFBlcmZvcm1hbmNlVGVzdChUZXN0U3VpdGUgc3VpdGUsIEJhc2VUZXN0Q2FzZSB0ZXN0LCBpbnQgdGFnZ2luZywgU3RyaW5nIHNob3J0TmFtZSkgewotCQlQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlciB0ZXN0Q2FzZSA9IG5ldyBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlcih0ZXN0LCB0YWdnaW5nICwgc2hvcnROYW1lKTsKLQkJc3VpdGUuYWRkVGVzdCh0ZXN0Q2FzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL0hlYWRlclBhcnNlclBlcmZvcm1hbmNlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL0hlYWRlclBhcnNlclBlcmZvcm1hbmNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2E3NmUxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9IZWFkZXJQYXJzZXJQZXJmb3JtYW5jZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5wbHVnaW4uSGVhZGxlc3NUZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIEhlYWRlclBhcnNlclBlcmZvcm1hbmNlVGVzdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfRElSID0gIlRlc3REYXRhIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgImhlYWRlclBhcnNlclRlc3REYXRhIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0IGRhdGEgPSBnZXRYTUxEYXRhKCk7Ci0JCWxvbmdbXSB0aW1lcyA9IG5ldyBsb25nW2RhdGEuc2l6ZSgpXTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlUZXN0RGF0YSB0ZXN0RGF0YSA9IChUZXN0RGF0YSkgZGF0YS5nZXQoaSk7Ci0JCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGdldERhdGFQYXRoKHRlc3REYXRhLmZpbGVOYW1lKSkpOwotCQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlKYXZhRUVRdWlja1BlZWsgcGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoaW4pOwotCQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJdGltZXNbaV0gPSBlbmQgLSBzdGFydDsKLQkJCQlpZiAodGltZXNbaV0gPT0gMCkgewotCQkJCQl0aW1lc1tpXSA9IDEwOyAvLyBzdHViIGluIGEgbWluaW11bSB0aW1lCi0JCQkJfQotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHModGVzdERhdGEudHlwZSwgcGVlay5nZXRUeXBlKCkpOwotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHModGVzdERhdGEubW9kVmVyc2lvbiwgcGVlay5nZXRWZXJzaW9uKCkpOwotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHModGVzdERhdGEuZWVWZXJzaW9uLCBwZWVrLmdldEphdmFFRVZlcnNpb24oKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aW1lcyBzaG91bGQgYmUgdGhlIHNhbWUKLQkJQXJyYXlzLnNvcnQodGltZXMpOwotCQlpZiAodGltZXNbMF0gKiAyIDwgdGltZXNbdGltZXMubGVuZ3RoIC0gMV0pIHsKLQkJCUFzc2VydC5mYWlsKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldFhNTERhdGEoKSB7Ci0JCUxpc3QgZGF0YSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJhcHBsaWNhdGlvbi1jbGllbnQxMi54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiYXBwbGljYXRpb24tY2xpZW50MTMueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lELCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoImFwcGxpY2F0aW9uLWNsaWVudDE0LnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJhcHBsaWNhdGlvbi1jbGllbnQ1LnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lELCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEKSk7Ci0KLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJhcHBsaWNhdGlvbjEyLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lELCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCkpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoImFwcGxpY2F0aW9uMTMueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiYXBwbGljYXRpb24xNC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJhcHBsaWNhdGlvbjUueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCkpOwotCi0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiZWpiLWphcjExLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lELCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCkpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoImVqYi1qYXIyMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJlamItamFyMjEueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiZWpiLWphcjMwLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lELCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEKSk7Ci0KLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJyYTEwLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkNPTk5FQ1RPUl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lELCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoInJhMTUueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQ09OTkVDVE9SX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSk7Ci0KLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJ3ZWIyMi54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJ3ZWIyMy54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJ3ZWIyNC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJ3ZWIyNS54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNV9JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCkpOwotCi0JCS8vIHRlc3Qgc29tZSBib2d1cyBkZHMgYXMgd2VsbAotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoIm5vdHhtbC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgibm90amF2YWVlLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoImFwcGxpY2F0aW9uLWNsaWVudDAueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJhcHBsaWNhdGlvbi1jbGllbnQwMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoImFwcGxpY2F0aW9uLWNsaWVudDAwMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikpOwotCi0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiYXBwbGljYXRpb24wLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJhcHBsaWNhdGlvbjAwLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJhcHBsaWNhdGlvbjAwMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSk7Ci0KLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJlamItamFyMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoImVqYi1qYXIwMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoImVqYi1qYXIwMDAueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoInJhMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5DT05ORUNUT1JfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoInJhMDAueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQ09OTkVDVE9SX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJyYTAwMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5DT05ORUNUT1JfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikpOwotCi0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgid2ViMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoIndlYjAwLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgid2ViMDAwLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSk7Ci0JCXJldHVybiBkYXRhOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFQYXRoKFN0cmluZyBzaG9ydE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlIZWFkbGVzc1Rlc3RzUGx1Z2luIHBsdWdpbiA9IEhlYWRsZXNzVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlTdHJpbmcgcGx1Z2luUmVsYXRpdmVGaWxlTmFtZSA9IERBVEFfRElSICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyBzaG9ydE5hbWU7Ci0JCXJldHVybiBQcm9qZWN0VXRpbGl0eS5nZXRGdWxsRmlsZU5hbWUocGx1Z2luLCBwbHVnaW5SZWxhdGl2ZUZpbGVOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBUZXN0RGF0YSB7Ci0JCVN0cmluZyBmaWxlTmFtZTsKLQotCQlpbnQgdHlwZTsKLQotCQlpbnQgbW9kVmVyc2lvbjsKLQotCQlpbnQgZWVWZXJzaW9uOwotCi0JCUNsYXNzIG1vZGVsT2JqZWN0SW50ZXJmYWNlOwotCi0JCXB1YmxpYyBUZXN0RGF0YShTdHJpbmcgZmlsZU5hbWUsIGludCB0eXBlLCBpbnQgbW9kVmVyc2lvbiwgaW50IGVlVmVyc2lvbikgewotCQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMubW9kVmVyc2lvbiA9IG1vZFZlcnNpb247Ci0JCQl0aGlzLmVlVmVyc2lvbiA9IGVlVmVyc2lvbjsKLQkJfQotCi0JCXB1YmxpYyBUZXN0RGF0YShTdHJpbmcgZmlsZU5hbWUsIGludCB0eXBlLCBpbnQgbW9kVmVyc2lvbiwgaW50IGVlVmVyc2lvbiwgQ2xhc3MgbW9kZWxUeXBlQ2xhc3MpIHsKLQkJCXRoaXMoZmlsZU5hbWUsIHR5cGUsIG1vZFZlcnNpb24sIGVlVmVyc2lvbik7Ci0JCQl0aGlzLm1vZGVsT2JqZWN0SW50ZXJmYWNlID0gbW9kZWxUeXBlQ2xhc3M7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDU1Yjc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJmb3JtYW5jZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBQZXJmb3JtYW5jZVBsdWdpbiBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFBlcmZvcm1hbmNlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJmb3JtYW5jZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUGVyZm9ybWFuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmJiYzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTm92IDI0LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5CYXNlVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljICBjbGFzcyBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlciBleHRlbmRzIFBlcmZvcm1hbmNlVGVzdENhc2UgewotCXByb3RlY3RlZCBCYXNlVGVzdENhc2UgZlRlc3Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUwgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMT0JBTCA9IDI7CQotCQotCXByaXZhdGUgYm9vbGVhbiB0YWdBc0dsb2JhbFN1bW1hcnk7Ci0JcHJpdmF0ZSBib29sZWFuIHRhZ0FzU3VtbWFyeTsKLQlwcml2YXRlIFN0cmluZyBzaG9ydE5hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRFUkFUSU9OUyA9IDEwOwotCi0JcHVibGljIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyKEJhc2VUZXN0Q2FzZSB0ZXN0LCAKLQkJCQkJCQkJCWludCB0YWdnaW5nLAotCQkJCQkJCQkJU3RyaW5nIHNob3J0TmFtZSkgewotCQlmVGVzdD10ZXN0OwotCQl0YWdBc0dsb2JhbFN1bW1hcnkgPSAoKHRhZ2dpbmcgJiBHTE9CQUwpICE9IDApOwotCSAgICB0YWdBc1N1bW1hcnkgPSAoKHRhZ2dpbmcgJiBMT0NBTCkgIT0gMCk7Ci0JICAgIHRoaXMuc2hvcnROYW1lID0gIHNob3J0TmFtZTsKLQl9Ci0JCi0JcHVibGljIGludCBjb3VudFRlc3RDYXNlcygpIHsKLQkJcmV0dXJuIGZUZXN0LmNvdW50VGVzdENhc2VzKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBmVGVzdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUZXN0IGdldFRlc3QoKSB7Ci0JCXJldHVybiBmVGVzdDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmVGVzdC5zZXRVcFRlc3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNTZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZT0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCQlmUGVyZm9ybWFuY2VNZXRlcj0gcGVyZm9ybWFuY2UuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcihwZXJmb3JtYW5jZS5nZXREZWZhdWx0U2NlbmFyaW9JZChmVGVzdCkpOwotCX0KLQotCQotCS8qKgotCSAqIFJ1bnMgdGhlIGJhcmUgdGVzdCBzZXF1ZW5jZS4KLQkgKiBAZXhjZXB0aW9uIFRocm93YWJsZSBpZiBhbnkgZXhjZXB0aW9uIGlzIHRocm93bgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bkJhcmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJYmFzaWNTZXRVcCgpOwotCQl0YWdJZk5lY2Vzc2FyeShzaG9ydE5hbWUsIERpbWVuc2lvbi5DUFVfVElNRSk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgSVRFUkFUSU9OUzsgaSsrKSB7Ci0JCQkJc2V0VXAoKTsKLQkJCQlzdGFydE1lYXN1cmluZygpOwotCQkJCXJ1blRlc3QoKTsKLQkJCQlzdG9wTWVhc3VyaW5nKCk7Ci0JCQl9Ci0JCQkKLQkJCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQkJYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRlYXJEb3duKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3J1blRlc3QoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlmVGVzdC5ydW5Db3JlVGVzdCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJZlRlc3QudGVhckRvd25UZXN0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWZUZXN0LnNldE5hbWUobmFtZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZUZXN0LmdldE5hbWUoKTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogQW5zd2VycyB3aGV0aGVyIHRoaXMgdGVzdCBzaG91bGQgYmUgdGFnZ2VkIGdsb2JhbGx5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIHRlc3Qgc2hvdWxkIGJlIHRhZ2dlZCBnbG9iYWxseQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRHbG9iYWxseVRhZygpIHsKLSAgICAJcmV0dXJuIHRhZ0FzR2xvYmFsU3VtbWFyeTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQW5zd2VycyB3aGV0aGVyIHRoaXMgdGVzdCBzaG91bGQgYmUgdGFnZ2VkIGxvY2FsbHkuCi0gICAgICogCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgdGVzdCBzaG91bGQgYmUgdGFnZ2VkIGxvY2FsbHkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkTG9jYWxseVRhZygpIHsKLSAgICAJcmV0dXJuIHRhZ0FzU3VtbWFyeTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGFnSWZOZWNlc3NhcnkoU3RyaW5nIHNob3J0TmFtZSwgRGltZW5zaW9uIGRpbWVuc2lvbikgewotCQlpZiAoc2hvdWxkR2xvYmFsbHlUYWcoKSkgewotCQkJdGFnQXNHbG9iYWxTdW1tYXJ5KHNob3J0TmFtZSwgZGltZW5zaW9uKTsKLQkJfQotCQlpZiAoc2hvdWxkTG9jYWxseVRhZygpKSB7Ci0JCQl0YWdBc1N1bW1hcnkoc2hvcnROYW1lLCBkaW1lbnNpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRhZ0lmTmVjZXNzYXJ5KFN0cmluZyBzaG9ydE5hbWUsIERpbWVuc2lvbiBbXSBkaW1lbnNpb25zKSB7Ci0JCWlmIChzaG91bGRHbG9iYWxseVRhZygpKSB7Ci0JCQl0YWdBc0dsb2JhbFN1bW1hcnkoc2hvcnROYW1lLCBkaW1lbnNpb25zKTsKLQkJfQotCQlpZiAoc2hvdWxkTG9jYWxseVRhZygpKSB7Ci0JCQl0YWdBc1N1bW1hcnkoc2hvcnROYW1lLCBkaW1lbnNpb25zKTsKLQkJfQotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RPYmplY3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzOTM0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0T2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJmb3JtYW5jZVRlc3RPYmplY3QgewotCWludCB0YWdnaW5nOwotCVN0cmluZyBzaG9ydE5hbWU7Ci0JU3RyaW5nIG5hbWU7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFBlcmZvcm1hbmNlVGVzdE9iamVjdChTdHJpbmcgbmFtZSxpbnQgdGFnZ2luZywgU3RyaW5nIHNob3J0bmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnRhZ2dpbmcgPSB0YWdnaW5nOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnNob3J0TmFtZSA9IHNob3J0bmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzaG9ydE5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0JCXJldHVybiBzaG9ydE5hbWU7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFnZ2luZy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhZ2dpbmcoKSB7Ci0JCXJldHVybiB0YWdnaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMjgzMTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQmFzZVRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgaXRld2sKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJmb3JtYW5jZVRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0lNUExFX05BTUUgPSAiUGVyZm9ybWFuY2UgVGVzdCI7Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgUGVyZm9ybWFuY2VUZXN0U3VpdGUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFRlc3QoVGVzdCB0ZXN0KSB7Ci0JCS8vbXVzdCBiZSBhIEJhc2VUZXN0Q2FzZSBzbyBpdCBjYW4gYmUgd3JhcHBlZCBpbiBhIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyCi0JCWlmKHRlc3QgaW5zdGFuY2VvZiBCYXNlVGVzdENhc2UpIHsKLQkJCVBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyIHBlcmZvcm1hbmNlVGVzdCA9IG5ldyBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlcigKLQkJCQkJKEJhc2VUZXN0Q2FzZSl0ZXN0LFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCxERUZBVUxUX1NJTVBMRV9OQU1FKTsKLQkJCXN1cGVyLmFkZFRlc3QocGVyZm9ybWFuY2VUZXN0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUZXN0KFRlc3QgdGVzdCwgU3RyaW5nIHNpbXBsZU5hbWUpIHsKLQkJLy9tdXN0IGJlIGEgQmFzZVRlc3RDYXNlIHNvIGl0IGNhbiBiZSB3cmFwcGVkIGluIGEgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIKLQkJaWYodGVzdCBpbnN0YW5jZW9mIEJhc2VUZXN0Q2FzZSkgewotCQkJUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIgcGVyZm9ybWFuY2VUZXN0ID0gbmV3IFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyKAotCQkJCQkoQmFzZVRlc3RDYXNlKXRlc3QsUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLHNpbXBsZU5hbWUpOwotCQkJc3VwZXIuYWRkVGVzdChwZXJmb3JtYW5jZVRlc3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1Rlc3RDYXNlU0FYUGFyc2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvVGVzdENhc2VTQVhQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4OWVhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvVGVzdENhc2VTQVhQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjksIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDYXNlU0FYUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCXByaXZhdGUgc3RhdGljIE1hcCBwZXJmb3JtYW5jZUNhc2VzID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DQVNFID0gInRlc3RDYXNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0QgPSAibWV0aG9kIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPUlRfTkFNRSA9ICJzaG9ydE5hbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdHSU5HID0gInRhZ2dpbmciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTkFNRSA9ICJuYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPQkFMID0gIkdMT0JBTCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMID0gIkxPQ0FMIjsKLQlwcml2YXRlIHN0YXRpYyBDbGFzcyBjdXJyZW50Q2xhenogPSBudWxsOwotCQotCi0JCi0JcHVibGljIE1hcCBkb0xvYWQoRmlsZSBmaWxlKSB7Ci0JCSBwZXJmb3JtYW5jZUNhc2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJIERlZmF1bHRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdENhc2VTQVhQYXJzZXIoKTsKLQkJIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJIHRyeSB7Ci0JCSAgU0FYUGFyc2VyIHNheFBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCSAgc2F4UGFyc2VyLnBhcnNlKGZpbGUgLCBoYW5kbGVyICk7Ci0JCSB9Ci0JCSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkgIFN5c3RlbS5lcnIucHJpbnRsbiAoIkZhaWxlZCB0byBjcmVhdGUgU0FYIHBhcnNlcjoiICsgZXgpOwotCQkgfQotCQkgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleCkgewotCQkgIFN5c3RlbS5lcnIucHJpbnRsbiAoIlNBWCBwYXJzZXIgZXhjZWVwdGlvbjoiICsgZXgpOwotCQkgfQotCQkgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCSAgU3lzdGVtLmVyci5wcmludGxuICgiSU8gZXhlY2VwdGlvbjoiICsgZXgpOwotCQkgfQotCQkgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkgIFN5c3RlbS5lcnIucHJpbnRsbiAoIkludmFsaWQgZmlsZSBhcmd1bWVudCIgKyBleCk7Ci0JCSB9Ci0JCSByZXR1cm4gcGVyZm9ybWFuY2VDYXNlczsKLQkgfQotCQotCSBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgCi0JICBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkgCWlmIChxdWFsaWZpZWROYW1lLmVxdWFscyhURVNUX0NBU0UpKSB7Ci0JCSAgZm9yIChpbnQgaSA9IDA7IGk8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkuZXF1YWxzSWdub3JlQ2FzZShDTEFTUykpIHsKLQkJICAgIAl0cnkgewotCQkgICAgCQljdXJyZW50Q2xhenogPSBsb2FkQ2xhc3MoYXR0cmlidXRlcy5nZXRWYWx1ZShpKSk7Ci0JCQkJCWlmIChwZXJmb3JtYW5jZUNhc2VzLmdldChjdXJyZW50Q2xhenopID09IG51bGwpIHsKLQkJCSAgICAJCUFycmF5TGlzdCBtZXRob2RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJICAgIAkJcGVyZm9ybWFuY2VDYXNlcy5wdXQoY3VycmVudENsYXp6LG1ldGhvZExpc3QpOwotCQkgICAgCQl9Ci0JCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWN1cnJlbnRDbGF6eiA9IG51bGw7Ci0JCQkJCSBTeXN0ZW0uZXJyLnByaW50bG4gKCJGYWlsZWQgdG8gbG9hZCBjbGFzczoiICsgYXR0cmlidXRlcy5nZXRWYWx1ZShpKSk7Ci0JCQkJCS8vZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCSAgICB9IC8vIGVuZCBvZiBpZgotCQkgIH0gLy8gZW5kIG9mIGZvcgotCSAJfSAvLyBlbmQgb2YgaWYgVEVTVF9DQVNFCi0JIAllbHNlIGlmIChxdWFsaWZpZWROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVUSE9EKSkgewotCSAJCSBTdHJpbmcgbWV0aG9kTmFtZSA9IG51bGw7Ci0JIAkJIGludCB0YWdnaW5nID0gMDsKLQkgCQkgU3RyaW5nIHNob3J0TmFtZSA9IG51bGw7Ci0JIAkJIAotCSAJCSBpZiAoY3VycmVudENsYXp6ID09IG51bGwpIHJldHVybjsKLQkgCQkgCi0JIAkJIGZvciAoaW50IGkgPSAwOyBpPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkgCQkgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkuZXF1YWxzSWdub3JlQ2FzZShNRVRIT0RfTkFNRSkpIHsKLQkgCQkgICAgCW1ldGhvZE5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCSAJCSAgICB9IAotCSAJCSAgICBlbHNlIGlmIChhdHRyaWJ1dGVzLmdldFFOYW1lKGkpLmVxdWFsc0lnbm9yZUNhc2UoVEFHR0lORykpewotCSAJCSAgICAJaWYgKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkuZXF1YWxzSWdub3JlQ2FzZShHTE9CQUwpKSB7Ci0JIAkJICAgIAkJdGFnZ2luZyA9IFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTDsKLQkgCQkgICAgCX0gZWxzZSBpZiAoYXR0cmlidXRlcy5nZXRWYWx1ZShpKS5lcXVhbHNJZ25vcmVDYXNlKExPQ0FMKSkgewotCSAJCSAgICAJCXRhZ2dpbmcgPSBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTDsKLQkgCQkgICAgCX0gZWxzZSB7Ci0JIAkJICAgIAkJdGFnZ2luZyA9IFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLk5PTkU7Ci0JIAkJICAgIAl9Ci0JIAkJIAl9IGVsc2UgaWYoYXR0cmlidXRlcy5nZXRRTmFtZShpKS5lcXVhbHNJZ25vcmVDYXNlKFNIT1JUX05BTUUpKSB7Ci0JIAkJIAkJc2hvcnROYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLQkgCQkJfQotCSAJCSB9IC8vIGVuZCBvZiBmb3IKLQkgCQkgTGlzdCBtZXRob2RMaXN0ID0gKExpc3QpIHBlcmZvcm1hbmNlQ2FzZXMuZ2V0KGN1cnJlbnRDbGF6eik7Ci0JIAkJIG1ldGhvZExpc3QuYWRkKG5ldyBQZXJmb3JtYW5jZVRlc3RPYmplY3QobWV0aG9kTmFtZSx0YWdnaW5nLHNob3J0TmFtZSkpOwotCSAJIH0KLQkgfQotCi0JIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpCi0JICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkgICAgaWYgKHF1YWxpZmllZE5hbWUuZXF1YWxzKFRFU1RfQ0FTRSkpIHsKLQkgIAkJY3VycmVudENsYXp6ID0gbnVsbDsKLQkgIAl9Ci0JIH0KLQkgCi0JIC8qKgotCSAqIExvYWRzIHRoZSB0ZXN0IHN1aXRlIGNsYXNzLgotCSAqLwotCSBwcml2YXRlIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JIH0KLQkgCi0JIC8qKgotCSAqIFRoZSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZCBmb3IgbG9hZGluZyB0ZXN0cy4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byB1c2UgYW5vdGhlciBjbGFzcyBsb2FkZXIuCi0JICovCi0JIHByb3RlY3RlZCBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLQkJcmV0dXJuIEJhc2VQZXJmb3JtYW5jZVRlc3RDYXNlLmdldENsYXNzTG9hZGVyKCk7Ci0JIH0KLQkgCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9XVFBIZWFkbGVzc1BlcmZvcm1hbmNlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9XVFBIZWFkbGVzc1BlcmZvcm1hbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4Y2RjMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvV1RQSGVhZGxlc3NQZXJmb3JtYW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5lYXIub3BlcmF0aW9ucy5FQVJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0OwotCi0vKioKLSAqIEBhdXRob3IgaXRld2sKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBIZWFkbGVzc1BlcmZvcm1hbmNlVGVzdHMgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RTdWl0ZSB7Ci0JcHVibGljIFdUUEhlYWRsZXNzUGVyZm9ybWFuY2VUZXN0cygpIHsKLQkJc3VwZXIoIkFsbCBXVFAgSGVhZGxlc3MgUGVyZm9ybWFuY2VzIFRlc3RzIik7Ci0JCQotCQlhZGRUZXN0KG5ldyBFQVJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0KCJ0ZXN0RUFSMTRfV2l0aERlcGVuZGVuY2llcyIpLCAiVGVzdCBFQVIgMS40IFByb2plY3QgQ3JlYXRpb24gd2l0aCBEZXBlbmRpbmNpZXMiKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0JCXJldHVybiBuZXcgV1RQSGVhZGxlc3NQZXJmb3JtYW5jZVRlc3RzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDRlODAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UiCi0gICBuYW1lPSJQZXJmb3JtYW5jZSBQbHVnLWluIgotICAgdmVyc2lvbj0iMS4xLjAiCi0gICBwcm92aWRlci1uYW1lPSIiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InBlcmZvcm1hbmNlLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NjU3ZWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id2VibW9kdWxlLXRvbWNhdC10ZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMzZlMzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi11aS5qYXIKLXRlc3RzLmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyYzFjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLnNlcnZsZXQudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWFiYmQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBKdW4gMDMgMDE6MjQ6MTcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzhjNGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMS4xMDEucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiB0ZXN0cy5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLlNlcnZsZXRUZXN0c1BsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMuYnZ0LAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRvbWNhdC50ZXN0cwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cywKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL0V4YW1wbGUxLndhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL0V4YW1wbGUxLndhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzMGEzOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9FeGFtcGxlMS53YXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9UZXN0MTJXZWIud2FyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvVGVzdDEyV2ViLndhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyMjBiMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9UZXN0MTJXZWIud2FyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvVGVzdDEzV2ViLndhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1Rlc3QxM1dlYi53YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYWE5MjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvVGVzdDEzV2ViLndhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1Rlc3QxNFdlYi53YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9UZXN0MTRXZWIud2FyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWIyYTNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1Rlc3QxNFdlYi53YXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9Zb3VyQ29tcGFueUV4YW1wbGUud2FyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvWW91ckNvbXBhbnlFeGFtcGxlLndhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5NjI4Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9Zb3VyQ29tcGFueUV4YW1wbGUud2FyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZGIyZTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS50ZXN0cy5qYXIgPSB3ZWJtb2R1bGUtdG9tY2F0LXRlc3RzLwotb3V0cHV0LnRlc3RzLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHRlc3RzLmphcixcCi0gICAgICAgICAgICAgICBXQVJJbXBvcnRUZXN0cy8sXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwN2YyMWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUExVR0lOPW9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiYjk4Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gPCEtLSA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLURvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MD0ke3Rlc3REaXJ9LyR7dG9tY2F0NTBEaXJ9Ii8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ianN0LWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qc3RfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7anN0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pzdC1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQiIC8+Ci0gICAJICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvU2VydmxldFRlc3RzUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL1NlcnZsZXRUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGIyYTdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvU2VydmxldFRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldFRlc3RzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmxldFRlc3RzUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgU2VydmxldFRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2bGV0VGVzdHNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFNlcnZsZXRUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMuU2VydmxldFRlc3RzUGx1Z2luUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90ZXN0cy9idnQvQXV0b21hdGVkQlZULmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliMmIyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy5idnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkQlZUIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VEaXJlY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJXQVJJbXBvcnRUZXN0cyIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzIikuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIAlBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAiVGVzdERhdGEiKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNpbmcgd29ya2luZyBkaXJlY3Rvcnkgc2luY2UgYSB3b3Jrc3BhY2UgVVJMIGNvdWxkIG5vdCBiZSBsb2NhdGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0gCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgdW5pbXBsZW1lbnRlZE1ldGhvZHM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgICAgIGlmICh1bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgdW5pbXBsZW1lbnRlZE1ldGhvZHMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQXV0b21hdGVkQlZUKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSAoVGVzdFN1aXRlKSBBdXRvbWF0ZWRCVlQuc3VpdGUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWl0ZS50ZXN0Q291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRUZXN0KHN1aXRlLnRlc3RBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLmJ2dCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8vc3VpdGUuYWRkVGVzdChBbGxUb21jYXRUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVEVjbGlwc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVEVjbGlwc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0ZmJiNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLmJ2dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkQlZURWNsaXBzZSBleHRlbmRzIEF1dG9tYXRlZEJWVCB7Ci0JCi0JcHVibGljIEF1dG9tYXRlZEJWVEVjbGlwc2UoKXsKLQkJc3VwZXIoKTsKLQkJVVJMIHVybCA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMiKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCUF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpLmdldEZpbGUoKSArICJXQVJJbXBvcnRUZXN0cyIrIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9BbGxUb21jYXRUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvQWxsVG9tY2F0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4ZTM1ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9BbGxUb21jYXRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRvbWNhdC50ZXN0czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUb21jYXRUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBJUnVudGltZSBUT01DQVRfUlVOVElNRSA9IGNyZWF0ZVJ1bnRpbWUoKTsKLQkKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLSAgICAgICAgcmV0dXJuIG5ldyBBbGxUb21jYXRUZXN0cygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQWxsVG9tY2F0VGVzdHMoKXsKLSAgICAgICAgc3VwZXIoIldFQiBUZXN0cyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZFRlc3QoV2ViUHJvamVjdENyZWF0aW9uVG9tY2F0VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChXZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFdlYkV4cG9ydE9wZXJhdGlvblRvbWNhdFRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lIGNyZWF0ZVJ1bnRpbWUoKSAgewotICAgIAlTdHJpbmcgcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkKLSAgICAJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJdHJ5IHsKLSAgICAJCUlSdW50aW1lVHlwZSBydCA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJCUlSdW50aW1lV29ya2luZ0NvcHkgd2MgPSBydC5jcmVhdGVSdW50aW1lKG51bGwsIG51bGwpOwotICAgIAkJd2Muc2V0TG9jYXRpb24obmV3IFBhdGgocykpOwotICAgIAkJcmV0dXJuIHdjLnNhdmUodHJ1ZSwgbnVsbCk7Ci0gICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJFeHBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJFeHBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OWQ5ODYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvV2ViRXhwb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50b21jYXQudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlByb2plY3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuU2ltcGxlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0OwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJFeHBvcnRPcGVyYXRpb25Ub21jYXRUZXN0IGV4dGVuZHMgTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdCB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlQ29tcGlsZUpzcCA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGV4cG9ydFNvdXJjZUZpbGVzID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcndyaXRlRXhpc3RpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXRhTW9kZWxTaG91bGRCZVZhbGlkID0gdHJ1ZTsKLQotCXB1YmxpYyBXZWJFeHBvcnRPcGVyYXRpb25Ub21jYXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUZXN0U3VpdGUoV2ViRXhwb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuT3BlcmF0aW9uVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWV4Y2x1ZGVDb21waWxlSnNwID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVDb21waWxlSnNwT24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZXhjbHVkZUNvbXBpbGVKc3AgPSB0cnVlOwotCQl0ZXN0QWxsRXhwb3J0VGVzdENhc2VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0TW9kZWxJbnN0YW5jZSgpCi0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0TW9kZWxJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0JcHJvdGVjdGVkIElQcm9qZWN0W10gZ2V0RXhwb3J0YWJsZVByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlkZWxldGVBbGxQcm9qZWN0cygpOwotCQlXZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0IGltcG9ydFRlc3RDYXNlID0gKFdlYkltcG9ydE9wZXJhdGlvblRvbWNhdFRlc3QpZ2V0SW1wb3J0VGVzdENhc2UoKTsgCi0JCWltcG9ydFRlc3RDYXNlLnRlc3RBbGxJbXBvcnRUZXN0Q2FzZXMoKTsKLQotCQkvLyBpZiB0aGUgcHJvamVjdHMgYXJlbid0IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LCB0aGUgcHJldmlvdXMKLQkJLy8gbGluZSB3aWxsIGZhaWwgc28gdGhlcmUncyBubyBuZWVkIHRvIHZlcmlmeQotCQlJUHJvamVjdFtdIHByb2pzID0gUHJvamVjdFV0aWxpdHkuZ2V0QWxsUHJvamVjdHMoKTsKLQkJCi0JCUxpc3QgZmlsdGVyZWRQcm9qcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qcy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2pzW2ldOwotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpCi0JCQkJZmlsdGVyZWRQcm9qcy5hZGQocHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSBmaWx0ZXJlZFByb2pzLnRvQXJyYXkobmV3IElQcm9qZWN0W2ZpbHRlcmVkUHJvanMuc2l6ZSgpXSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRXhwb3J0VGVzdENhc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJRmlsZSBleHBvcnREaXJlY3RvcnkgPSBuZXcgRmlsZShCQVNFX0RBVEFfRElSKTsKLQkJaWYgKGV4cG9ydERpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlW10gY29udGVudHMgPSBleHBvcnREaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFjb250ZW50c1tpXS5pc0RpcmVjdG9yeSgpKQotCQkJCQljb250ZW50c1tpXS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0RXhwb3J0YWJsZVByb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXRlc3RFeHBvcnQoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdHNbaV0pLCBnZXRGaWxlTmFtZShwcm9qZWN0c1tpXS5nZXROYW1lKCkpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBiYXNlTmFtZSkgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihiYXNlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoKGV4cG9ydFNvdXJjZUZpbGVzKSA/ICJfd2l0aFNvdXJjZSIgOiAiX3dpdGhvdXRTb3VyY2UiKS5hcHBlbmQoZ2V0TW9kdWxlRXh0ZW5zaW9uKCkpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGdldE1vZGVsSW5zdGFuY2UoKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5BUkNISVZFX0RFU1RJTkFUSU9OLCBCQVNFX0RBVEFfRElSICsgZmlsZW5hbWUpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLkNPTVBPTkVOVCwgY29tcG9uZW50KTsKLQkJZGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuRVhQT1JUX1NPVVJDRV9GSUxFUywgZXhwb3J0U291cmNlRmlsZXMpOwotCQlkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5PVkVSV1JJVEVfRVhJU1RJTkcsIG92ZXJ3cml0ZUV4aXN0aW5nKTsKLQotCQlpZiAoZGF0YU1vZGVsU2hvdWxkQmVWYWxpZCkKLQkJCXJ1bkFuZFZlcmlmeShkYXRhTW9kZWwpOwotCQllbHNlCi0JCQl2ZXJpZnlJbnZhbGlkRGF0YU1vZGVsKGRhdGFNb2RlbCk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0Q2FzZSNnZXRJbXBvcnRUZXN0Q2FzZSgpCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3QgZ2V0SW1wb3J0VGVzdENhc2UoKSB7Ci0JCXJldHVybiBuZXcgV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhRmlsZXNUb1Byb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLAotCQkJU3RyaW5nW10gY2xhc3NOYW1lcywgU3RyaW5nIHByYWNrYWdlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SmF2YUZpbGVzRXhwb3J0ZWQoU3RyaW5nIGFyY2hpdmVQYXRoLAotCQkJU3RyaW5nW10gY2xhc3NOYW1lcywgU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIHdpdGhDbGFzc0ZpbGVzLAotCQkJYm9vbGVhbiB3aXRoU291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXRFeHBvcnREYXRhTW9kZWwoU3RyaW5nIHByb2plY3ROYW1lLAotCQkJU3RyaW5nIGRlc3RpbmF0aW9uLCBib29sZWFuIGV4cG9ydFNvdXJjZSwgYm9vbGVhbiBydW5CdWlsZCwKLQkJCWJvb2xlYW4gb3ZlcndyaXRlRXhpc3RpbmcpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICIud2FyIjsvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDgxYzE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL1dlYkltcG9ydE9wZXJhdGlvblRvbWNhdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudG9tY2F0LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLklPdmVyd3JpdGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlByb2plY3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuU2ltcGxlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLnBsdWdpbi5IZWFkbGVzc1Rlc3RzUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0IGV4dGVuZHMgTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVFNfUEFUSCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgIlRlc3REYXRhIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgIldBUkltcG9ydFRlc3RzIjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXRhTW9kZWxTaG91bGRCZVZhbGlkID0gdHJ1ZTsKLQkKLQlwdWJsaWMgV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdCgpIHsKLQkJc3VwZXIoIldlYkltcG9ydE9wZXJhdGlvblRvbWNhdFRlc3RzIik7Ci0JfQotCQotCXB1YmxpYyBXZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUZXN0U3VpdGUoV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0TW9kZWxJbnN0YW5jZSgpCi0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0TW9kZWxJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG51bGw7IC8vIG5ldyBXZWJNb2R1bGVJbXBvcnREYXRhTW9kZWwoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZSNnZXRJbXBvcnRhYmxlQXJjaGl2ZUZpbGVOYW1lcygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0SW1wb3J0YWJsZUFyY2hpdmVGaWxlTmFtZXMoKSB7Ci0JCXJldHVybiBQcm9qZWN0VXRpbGl0eS5nZXRXYXJzSW5EaXJlY3RvcnkoSGVhZGxlc3NUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCksIFRFU1RTX1BBVEgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlI3NldFNlcnZlclRhcmdldFByb3BlcnR5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLm9wZXJhdGlvbnMuSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUYXJnZXRQcm9wZXJ0eShJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQkvLyBkYXRhTW9kZWwuc2V0UHJvcGVydHkoU2VydmVyVGFyZ2V0RGF0YU1vZGVsLlJVTlRJTUVfVEFSR0VUX0lELEFsbFRvbWNhdFRlc3RzLlRPTUNBVF9SVU5USU1FLmdldElkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsSW1wb3J0VGVzdENhc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdCBwcm9qZWN0cyA9IGdldEltcG9ydGFibGVBcmNoaXZlRmlsZU5hbWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBqYXJOYW1lID0gcHJvamVjdHMuZ2V0KGkpLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBqYXJOYW1lLnN1YnN0cmluZyhqYXJOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSArIDEsIGphck5hbWUubGVuZ3RoKCkgLSA0KTsKLQkJCXRlc3RJbXBvcnQocHJvamVjdE5hbWUsIGphck5hbWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV8wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV8xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV8yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV8zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV80KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV81KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV82KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDYpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV83KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV84KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV85KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW1wb3J0SW5kZXgoaW50IGluZGV4KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdCBwcm9qZWN0cyA9IGdldEltcG9ydGFibGVBcmNoaXZlRmlsZU5hbWVzKCk7Ci0JCWlmIChpbmRleCA8IHByb2plY3RzLnNpemUoKSkgewotCQkJU3RyaW5nIGphck5hbWUgPSBwcm9qZWN0cy5nZXQoaW5kZXgpLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBqYXJOYW1lLnN1YnN0cmluZyhqYXJOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSArIDEsIGphck5hbWUubGVuZ3RoKCkgLSA0KTsKLQkJCXRlc3RJbXBvcnQocHJvamVjdE5hbWUsIGphck5hbWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV9yZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcHJvamVjdHMgPSBnZXRJbXBvcnRhYmxlQXJjaGl2ZUZpbGVOYW1lcygpOwotCQlmb3IgKGludCBpID0gMTA7IGkgPCBwcm9qZWN0cy5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIGphck5hbWUgPSBwcm9qZWN0cy5nZXQoaSkudG9TdHJpbmcoKTsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGphck5hbWUuc3Vic3RyaW5nKGphck5hbWUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpICsgMSwgamFyTmFtZS5sZW5ndGgoKSAtIDQpOwotCQkJdGVzdEltcG9ydChwcm9qZWN0TmFtZSwgamFyTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEltcG9ydChTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gZ2V0TW9kZWxJbnN0YW5jZSgpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgZmlsZW5hbWUpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotCQlpZiAoZGF0YU1vZGVsU2hvdWxkQmVWYWxpZCkKLQkJCXJ1bkFuZFZlcmlmeShkYXRhTW9kZWwpOwotCQllbHNlCi0JCQl2ZXJpZnlJbnZhbGlkRGF0YU1vZGVsKGRhdGFNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZEZpbGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJZGF0YU1vZGVsU2hvdWxkQmVWYWxpZCA9IGZhbHNlOwotCQl0ZXN0SW1wb3J0KCJCb2JUaGVQcm9qZWN0IiwgIkJvYlRoZUZpbGUiKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0RXhwb3J0RGF0YU1vZGVsKFN0cmluZyBwcm9qZWN0TmFtZSwKLQkJCVN0cmluZyBkZXN0aW5hdGlvbiwgYm9vbGVhbiBleHBvcnRTb3VyY2UsIGJvb2xlYW4gcnVuQnVpbGQsCi0JCQlib29sZWFuIG92ZXJ3cml0ZUV4aXN0aW5nKSB7Ci0JCQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldEltcG9ydERhdGFNb2RlbChTdHJpbmcgZmlsZVBhdGgsCi0JCQlTdHJpbmcgcHJvamVjdE5hbWUsIElPdmVyd3JpdGVIYW5kbGVyIG92ZXJ3cml0ZUhhbmRsZXIsCi0JCQlJRGF0YU1vZGVsIGNyZWF0aW9uTW9kZWwsIGJvb2xlYW4gY2xvc2VBcmNoaXZlT25EaXNwb3NlKSB7Ci0JCQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZUV4dGVuc2lvbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL1dlYlByb2plY3RDcmVhdGlvblRvbWNhdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL1dlYlByb2plY3RDcmVhdGlvblRvbWNhdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlYjRjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJQcm9qZWN0Q3JlYXRpb25Ub21jYXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudG9tY2F0LnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQW5ub3RhdGlvbnNEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkFkZFNlcnZsZXRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRmFjZXREYXRhTW9kZWxNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkxvZ1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlRhc2tWaWV3VXRpbGl0eTsKLQotLyoqIAotICogQGF1dGhvciBibGFuY2V0dAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJQcm9qZWN0Q3JlYXRpb25Ub21jYXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVNpbXBsZVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0gICAgICAgIHNldFNlcnZlclRhcmdldFByb3BlcnR5KGRhdGFNb2RlbCk7Ci0gICAgICAgIGRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZGF0YU1vZGVsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyVGFyZ2V0UHJvcGVydHkoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLSAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSwgQWxsVG9tY2F0VGVzdHMuVE9NQ0FUX1JVTlRJTUUuZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVNlcnZsZXQoSURhdGFNb2RlbCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICBBZGRTZXJ2bGV0T3BlcmF0aW9uIG9wID0gbmV3IEFkZFNlcnZsZXRPcGVyYXRpb24obW9kZWwpOwotICAgICAgICAgb3AuZXhlY3V0ZShudWxsLG51bGwpOwotICAgICAgICAgUHJvamVjdFV0aWxpdHkudmVyaWZ5UHJvamVjdChvcC5nZXRUYXJnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB0cnVlKTsgCi0gICAgICAgICBUYXNrVmlld1V0aWxpdHkudmVyaWZ5Tm9FcnJvcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURhdGFNb2RlbCBzZXR1cFN0YW5kYWxvbmVXZWJQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgaW50IGoyZWVWZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY3JlYXRlU2ltcGxlUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBnZXRXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbChwcm9qZWN0TmFtZSwgajJlZVZlcnNpb24pOwotICAgICAgICBjcmVhdGVTdGFuZGFsb25lV2ViUHJvamVjdChtb2RlbCk7Ci0gICAgICAgIGNyZWF0ZVNlcnZsZXQocHJvamVjdE5hbWUpOwotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgcHVibGljIElEYXRhTW9kZWwgc2V0dXBTdGFuZGFsb25lQW5ub3RhdGVkV2ViUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGludCBqMmVlVmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNyZWF0ZVNpbXBsZVByb2plY3QocHJvamVjdE5hbWUpOwotCi0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBnZXRXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbChwcm9qZWN0TmFtZSwgajJlZVZlcnNpb24pOwotICAgICAgICBjcmVhdGVTdGFuZGFsb25lV2ViUHJvamVjdChtb2RlbCk7Ci0gICAgICAgIGNyZWF0ZUFubm90YXRlZFNlcnZsZXQocHJvamVjdE5hbWUpOwotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTdGFuZGFsb25lV2ViUHJvamVjdChJRGF0YU1vZGVsIG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSURhdGFNb2RlbE9wZXJhdGlvbiB3ZWJPcCA9IG1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLSAgICAgICAgd2ViT3AuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLSAgICAgICAgLy8gUHJvamVjdFV0aWxpdHkudmVyaWZ5UHJvamVjdChtb2RlbC5nZXRUYXJnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLAotICAgICAgICAvLyB0cnVlKTsKLSAgICAgICAgVGFza1ZpZXdVdGlsaXR5LnZlcmlmeU5vRXJyb3JzKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSURhdGFNb2RlbCBnZXRXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbChTdHJpbmcgcHJvamVjdE5hbWUsIGludCBqMmVlVmVyc2lvbikgewotICAgICAgICBJUHJvamVjdCBqYXZhUHJvamVjdCA9IFByb2plY3RVdGlsaXR5LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IHByb2plY3ROYW1lICsgIldlYk1vZHVsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIG1vZHVsZURlcGxveU5hbWUgPSBtb2R1bGVOYW1lICsgIi53YXIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5jbGFzcyk7Ci0gICAgICAgIG1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBqYXZhUHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICBGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLSAgICAgICAgSURhdGFNb2RlbCB3ZWJNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5EWU5BTUlDX1dFQik7Ci0gICAgICAgIHdlYk1vZGVsLnNldEludFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTixqMmVlVmVyc2lvbik7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTZXJ2bGV0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElEYXRhTW9kZWwgc2VydmxldE1vZGVsID0gc2V0dXBTZXJ2bGV0Q3JlYXRpb25EYXRhTW9kZWwocHJvamVjdE5hbWUsIGZhbHNlKTsKLSAgICAgICAgY3JlYXRlU2VydmxldChzZXJ2bGV0TW9kZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRlZFNlcnZsZXQoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSURhdGFNb2RlbCBzZXJ2bGV0TW9kZWwgPSBzZXR1cFNlcnZsZXRDcmVhdGlvbkRhdGFNb2RlbChwcm9qZWN0TmFtZSwgdHJ1ZSk7Ci0gICAgICAgIGNyZWF0ZVNlcnZsZXQoc2VydmxldE1vZGVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURhdGFNb2RlbCBzZXR1cFNlcnZsZXRDcmVhdGlvbkRhdGFNb2RlbChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gaXNBbm5vdGF0ZWQpIHsKLSAgICAJSURhdGFNb2RlbCBzZXJ2bGV0RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICBzZXJ2bGV0RGF0YU1vZGVsLnNldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICBzZXJ2bGV0RGF0YU1vZGVsLnNldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0gICAgICAgIHNlcnZsZXREYXRhTW9kZWwuc2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ0xBU1NfTkFNRSwgIkZvb1NlcnZsZXQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXJ2bGV0RGF0YU1vZGVsLnNldFByb3BlcnR5KElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRJU1BMQVlfTkFNRSwgIkZvb1NlcnZsZXQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXJ2bGV0RGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJQW5ub3RhdGlvbnNEYXRhTW9kZWwuVVNFX0FOTk9UQVRJT05TLCBpc0Fubm90YXRlZCk7Ci0gICAgICAgIHJldHVybiBzZXJ2bGV0RGF0YU1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVZhaWxkUHJvamVjdEFuZFNlcnZsZXRDcmVhdGlvbihTdHJpbmcgcHJvamVjdE5hbWUsIGludCBqMmVlVmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExvZ1V0aWxpdHkuZ2V0SW5zdGFuY2UoKS5yZXNldExvZ2dpbmcoKTsKLSAgICAgICAgSURhdGFNb2RlbCBtb2RlbCA9IG51bGw7Ci0gICAgICAgIG1vZGVsID0gc2V0dXBTdGFuZGFsb25lV2ViUHJvamVjdChwcm9qZWN0TmFtZSwgajJlZVZlcnNpb24pOwotICAgICAgICBMb2dVdGlsaXR5LmdldEluc3RhbmNlKCkudmVyaWZ5Tm9XYXJuaW5ncygpOwotICAgICAgICBjaGVja1ZhbGlkRGF0YU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVWYWlsZEFubm90YXRlZFByb2plY3RBbmRTZXJ2bGV0Q3JlYXRpb24oU3RyaW5nIHByb2plY3ROYW1lLCBpbnQgajJlZVZlcnNpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2dVdGlsaXR5LmdldEluc3RhbmNlKCkucmVzZXRMb2dnaW5nKCk7Ci0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBudWxsOwotICAgICAgICBtb2RlbCA9IHNldHVwU3RhbmRhbG9uZUFubm90YXRlZFdlYlByb2plY3QocHJvamVjdE5hbWUsIGoyZWVWZXJzaW9uKTsKLSAgICAgICAgTG9nVXRpbGl0eS5nZXRJbnN0YW5jZSgpLnZlcmlmeU5vV2FybmluZ3MoKTsKLSAgICAgICAgY2hlY2tWYWxpZERhdGFNb2RlbChtb2RlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1vZGVsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tWYWxpZERhdGFNb2RlbChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIC8vIERhdGFNb2RlbFZlcmlmaWVyIHZlcmlmaWVyID0KLSAgICAgICAgLy8gRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlVmVyaWZpZXIobW9kZWwpOwotICAgICAgICAvLyB0cnkgewotICAgICAgICAvLyB2ZXJpZmllci52ZXJpZnkobW9kZWwpOwotICAgICAgICAvLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAvLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgIC8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIC8vIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWlsZDEyV2ViUHJvamVjdE5hbWVDcmVhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotICAgICAgICBjcmVhdGVWYWlsZFByb2plY3RBbmRTZXJ2bGV0Q3JlYXRpb24oIkZvb1RvbWNhdFdlYlByb2plY3QxMiIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUT0RPIFVuY29tbWVudCB0aGlzIG1ldGhvZCB3aGVuIEFubm90YXRpb24gc3VwcG9ydCBmb3Igc2VydmxldHMgaXMKLSAgICAgKiBlbmFibGVkIHB1YmxpYyB2b2lkIHRlc3RWYWlsZDEyQW5ub3RhdGVkV2ViUHJvamVjdE5hbWVDcmVhdGlvbigpIHRocm93cwotICAgICAqIEV4Y2VwdGlvbiB7IFByb2plY3RVdGlsaXR5LmRlbGV0ZUFsbFByb2plY3RzKCk7Ci0gICAgICogY3JlYXRlVmFpbGRBbm5vdGF0ZWRQcm9qZWN0QW5kU2VydmxldENyZWF0aW9uKCJGb29Bbm5vdGF0ZWRUb21jYXRXZWJQcm9qZWN0MTIiLAotICAgICAqIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQpOyB9Ci0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFpbGQxM1dlYlByb2plY3ROYW1lQ3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLSAgICAgICAgY3JlYXRlVmFpbGRQcm9qZWN0QW5kU2VydmxldENyZWF0aW9uKCJGb28xVG9tY2F0V2ViUHJvamVjdDEzIiwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRPRE8gVW5jb21tZW50IHRoaXMgbWV0aG9kIHdoZW4gQW5ub3RhdGlvbiBzdXBwb3J0IGZvciBzZXJ2bGV0cyBpcwotICAgICAqIGVuYWJsZWQgcHVibGljIHZvaWQgdGVzdFZhaWxkMTNBbm5vdGF0ZWRXZWJQcm9qZWN0TmFtZUNyZWF0aW9uKCkgdGhyb3dzCi0gICAgICogRXhjZXB0aW9uIHsgUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLSAgICAgKiBjcmVhdGVWYWlsZEFubm90YXRlZFByb2plY3RBbmRTZXJ2bGV0Q3JlYXRpb24oIkZvbzFUb21jYXRXZWJQcm9qZWN0MTMiLAotICAgICAqIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQpOyB9Ci0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFpbGQxNFdlYlByb2plY3ROYW1lQ3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLSAgICAgICAgY3JlYXRlVmFpbGRQcm9qZWN0QW5kU2VydmxldENyZWF0aW9uKCJGb28xVG9tY2F0V2ViUHJvamVjdDE0IiwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRPRE8gVW5jb21tZW50IHRoaXMgbWV0aG9kIHdoZW4gQW5ub3RhdGlvbiBzdXBwb3J0IGZvciBzZXJ2bGV0cyBpcwotICAgICAqIGVuYWJsZWQgcHVibGljIHZvaWQgdGVzdFZhaWxkMTRBbm5vdGF0ZWRXZWJQcm9qZWN0TmFtZUNyZWF0aW9uKCkgdGhyb3dzCi0gICAgICogRXhjZXB0aW9uIHsgUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLSAgICAgKiBjcmVhdGVWYWlsZEFubm90YXRlZFByb2plY3RBbmRTZXJ2bGV0Q3JlYXRpb24oIkZvbzFUb21jYXRXZWJQcm9qZWN0MTQiLAotICAgICAqIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQpOyB9Ci0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKFdlYlByb2plY3RDcmVhdGlvblRvbWNhdFRlc3QuY2xhc3MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QjZ2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSURhdGFNb2RlbCBnZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTYyMTcyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydGllc1ZhbGlkYXRvci8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0aWVzVmFsRlMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydGllc1ZhbFdCLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZpbGVzeXN0ZW1GV0svIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMmYwMjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1ydW50aW1lCi10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTBiNDc3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdmODBlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLnJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIgPSBwcm9wZXJ0aWVzVmFsaWRhdG9yLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNWYWxGUy8sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVmFsV0IvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXN5c3RlbUZXSy8KLWJpbi5pbmNsdWRlcyA9IHJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBmaWxlc3lzdGVtLmJhdCxcCi0gICAgICAgICAgICAgICBwcm9wLmJhdCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBydW50aW1lL3Byb3BlcnRpZXNWYWxpZGF0b3IuamFyCi1vdXRwdXQucnVudGltZS9wcm9wZXJ0aWVzVmFsaWRhdG9yLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtLmJhdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjODVhOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLVJFTSAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi1SRU0gVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLVJFTSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi1SRU0gCi1SRU0gRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotUkVNIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi1SRU0gQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotUkVNIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotUkVNIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotUkVNICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLVJFTSBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotUkVNIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotUkVNIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotUkVNIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLVJFTSBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi1SRU0gCi1SRU0gVGhpcyBiYXRjaCBmaWxlIHJ1bnMgdGhlICJmaWxlc3lzdGVtIGZyYW1ld29yayIncyBhcHBsaWNhdGlvbgotUkVNCi1zZXRsb2NhbAotCi1pZiAiJUpBVkFfSE9NRSUiIEVRVSAiIiBnb3RvIHN5bnRheAotCi1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOy4uXGNvbS5pYm0uZXRvb2xzLmxvZ2dpbmcudXRpbF81LjEuMFxydW50aW1lXGxvZ3V0aWwuamFyCi1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOy4uXGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZV81LjEuMFxydW50aW1lXGNvbW1vbi5qYXIKLXNldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7LlxydW50aW1lXHByb3BlcnRpZXNWYWxpZGF0b3IuamFyCi1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOy5ccnVudGltZVxmaWxlc3lzdGVtRldLLmphcgotc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTsuXHJ1bnRpbWVccHJvcGVydGllc1ZhbFdCLmphcgotc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTsuXHJ1bnRpbWVccHJvcGVydGllc1ZhbEZTLmphcgotCi0lSkFWQV9IT01FJVxiaW5camF2YSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmZpbGVzeXN0ZW0uRmlsZXN5c3RlbUFwcGxpY2F0aW9uICUxCi1nb3RvIDplbmQKLQotOnN5bnRheAotZWNoby4KLWVjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGJlIHNldCB0byB0aGUgSlJFIGRpcmVjdG9yeS4KLWVjaG8gZS5nLiwgc2V0IEpBVkFfSE9NRT1DOlxKUkUKLWVjaG8gd2hlcmUgSlJFIGhhcyBhIHN1YmRpcmVjdG9yeSBuYW1lZCAiYmluIgotZWNoby4KLWVjaG8uCi1nb3RvIDplbmQKLQotOmVuZAotZW5kbG9jYWwKLUBlY2hvIG9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svZmlsZXN5c3RlbS5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svZmlsZXN5c3RlbS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzI4MzQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL2ZpbGVzeXN0ZW0ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMKLSMgTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0jIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSMgVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSMgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotIwotIyAgRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotIyAgVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSMgIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSMgIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotIyAgeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0jICAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0jICBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotIyAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0jICBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSMgIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSMgIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSMKLQotIyBWRkZTID0gVmFsaWRhdGlvbiBGcmFtZXdvcmsgRmlsZSBTeXN0ZW0gCi1WRkZTMDAwMCA9IFZGRlMwMDAwRTogSW50ZXJuYWwgZXJyb3IgY2F1c2VkIHByZW1hdHVyZSB0ZXJtaW5hdGlvbiBvZiB2YWxpZGF0b3IgezB9LiBTZWUgdGhlIHN0YWNrIHRyYWNlIGJlbG93LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1BcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbUFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDA3MzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbUFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5maWxlc3lzdGVtOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0b3JMYXVuY2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZSBzeXN0ZW0gYmFzZWQgYXBwbGljYXRpb24KLSAqIHdoaWNoIG5lZWRzIHRvIHVzZSB0aGUgY29tbW9uIHZhbGlkYXRpb24gQVBJcy4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVzeXN0ZW1BcHBsaWNhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGFyZ3ZbXSBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgYSBmdWxseS1xdWFsaWZpZWQgbGlzdCBvZiBmaWxlIG5hbWVzIAotCSAqIG9mIGZpbGVzIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZC4gCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCQlJRmlsZURlbHRhW10gZmlsZXMgPSBGaWxlc3lzdGVtTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0RmlsZURlbHRhcyhhcmd2KTsKLQkJYm9vbGVhbiBmdWxsQnVpbGQgPSAoKGZpbGVzID09IG51bGwpIHx8IChmaWxlcy5sZW5ndGggPT0gMCkpOwotCi0JCUlSZXBvcnRlciByZXBvcnRlciA9IG51bGw7Ci0JCWlmIChmdWxsQnVpbGQpIHsKLQkJCXJlcG9ydGVyID0gbmV3IEZ1bGxSZXBvcnRlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVwb3J0ZXIgPSBuZXcgSW5jcmVtZW50YWxSZXBvcnRlcigpOwotCQl9Ci0KLQkJRmlsZXN5c3RlbUxvYWRlciBsb2FkZXJzW10gPSBGaWxlc3lzdGVtTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0TG9hZGVycyhmaWxlcyk7Ci0JCWZvciAoaW50IGk9MDsgaTxsb2FkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlc3lzdGVtTG9hZGVyIGxvYWRlciA9IGxvYWRlcnNbaV07Ci0JCQl0cnkgewotCQkJCVZhbGlkYXRvckxhdW5jaGVyLmdldExhdW5jaGVyKCkuc3RhcnQobG9hZGVyLmdldEhlbHBlcigpLCBsb2FkZXIuZ2V0VmFsaWRhdG9yKCksIHJlcG9ydGVyKTsKLQkJCQlpZiAoIWZ1bGxCdWlsZCkgewotCQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpcmVwb3J0ZXIpLnJlcG9ydCgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCJmaWxlc3lzdGVtIiwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgIlZGRlMwMDAwIiwgbmV3IFN0cmluZ1tde2xvYWRlci5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKX0pOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobG9hZGVyLmdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQkJCQkKLQkJCQlpZihleGMuZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihleGMuZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJCQotCQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlpZihleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJLy8gY29udGludWUgd2l0aCB0aGUgbmV4dCB2YWxpZGF0aW9uCi0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCJmaWxlc3lzdGVtIiwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgIlZGRlMwMDAwIiwgbmV3IFN0cmluZ1tde2xvYWRlci5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKX0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhsb2FkZXIuZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCQkJCS8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgdmFsaWRhdGlvbgotCQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1Mb2FkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1Mb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0NGZjNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9GaWxlc3lzdGVtTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5maWxlc3lzdGVtOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFzc29jaWF0ZXMgYSBWYWxpZGF0b3Igd2l0aCBhIEhlbHBlciBhbmQgdGhlIGZpbGUgZXh0ZW5zaW9ucyB0aGF0Ci0gKiB0aGUgdmFsaWRhdG9yIHJ1bnMgb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlc3lzdGVtTG9hZGVyIHsKLQlwcml2YXRlIElGaWxlc3lzdGVtSGVscGVyIF9oZWxwZXIgPSBudWxsOwotCXByaXZhdGUgSVZhbGlkYXRvciBfdmFsaWRhdG9yID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIF9maWxlRXh0ZW5zaW9ucyA9IG51bGw7Ci0JCi0JcHVibGljIEZpbGVzeXN0ZW1Mb2FkZXIoU3RyaW5nW10gZmlsZUV4dGVuc2lvbnMsIElGaWxlc3lzdGVtSGVscGVyIGhlbHBlciwgSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJc3VwZXIoKTsKLQotCQlfZmlsZUV4dGVuc2lvbnMgPSBmaWxlRXh0ZW5zaW9uczsKLQkJX2hlbHBlciA9IGhlbHBlcjsKLQkJX3ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBoZWxwZXIgdGhhdCB0aGUgdmFsaWRhdG9yIG5lZWRzIHRvIGFjY2VzcyBpbmZvcm1hdGlvbiAKLQkgKiBpbiB0aGUgZmlsZXN5c3RlbSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkgKi8KLQlwdWJsaWMgSUZpbGVzeXN0ZW1IZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gX2hlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbGlkYXRvciB0aGF0IGNoZWNrcyB0aGUgcnVsZXMuCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBmaWxlIG5hbWUgZXh0ZW5zaW9ucyB0aGF0IHRoaXMgdmFsaWRhdG9yIHZhbGlkYXRlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RmlsZUV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBfZmlsZUV4dGVuc2lvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbU1hbmFnZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDM4M2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5maWxlc3lzdGVtOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLkZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGhlYXJ0IG9mIHRoZSBmaWxlc3lzdGVtIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogSXQgJnF1b3Q7bG9hZHMmcXVvdDsgZWFjaCB2YWxpZGF0b3IncyBtZXRhZGF0YQotICovCi1wdWJsaWMgY2xhc3MgRmlsZXN5c3RlbU1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIEZpbGVzeXN0ZW1NYW5hZ2VyIF9pbnN0ID0gbnVsbDsKLQlwcml2YXRlIFNldCBfbG9hZGVycyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBGaWxlc3lzdGVtTWFuYWdlcigpIHsKLQkJX2xvYWRlcnMgPSBuZXcgSGFzaFNldCgpOwotCQkKLQkJLy8gUGxlYXNlIHByZXRlbmQgdGhhdCB0aGlzIG1ldGFkYXRhLCBpLmUuLCB0aGUgZmlsZSBleHRlbnNpb24sIGZ1bGx5LXF1YWxpZmllZAotCQkvLyBjbGFzcyBuYW1lIG9mIHRoZSBoZWxwZXIsIGFuZCBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdmFsaWRhdG9yLCAKLQkJLy8gd2FzIGxvYWRlZCBnZW5lcmljYWxseSBzb21laG93LiBJbiBwcmFjdGljZSwgdGhpcyBpbmZvcm1hdGlvbiBjb3VsZCBiZSBzdG9yZWQKLQkJLy8gaW4gLnhtbCBmaWxlcywgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUsIGV0Yy4sIHRoYXQgdGhlIGZyYW1ld29yayB3b3VsZCByZWFkCi0JCS8vIHRvIGZpbmQgdGhlIGluc3RhbGxlZCB2YWxpZGF0b3JzLgotCQl0cnkgewotCQkJX2xvYWRlcnMuYWRkKG5ldyBGaWxlc3lzdGVtTG9hZGVyKG5ldyBTdHJpbmdbXXsiLnByb3BlcnRpZXMifSwgbG9hZEhlbHBlcigib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW1pbXBsLkZpbGVzeXN0ZW1Qcm9wZXJ0aWVzSGVscGVyIiksIGxvYWRWYWxpZGF0b3IoIm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5Qcm9wZXJ0aWVzVmFsaWRhdG9yIikpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJY2F0Y2goSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQljYXRjaChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGEgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYSBoZWxwZXIsIHJldHVybiBhbiBpbnN0YW5jZSBvZiBpdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJRmlsZXN5c3RlbUhlbHBlciBsb2FkSGVscGVyKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gIHsKLQkJcmV0dXJuIChJRmlsZXN5c3RlbUhlbHBlcilsb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhIHZhbGlkYXRvciwgcmV0dXJuIGFuIGluc3RhbmNlIG9mIGl0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIElWYWxpZGF0b3IgbG9hZFZhbGlkYXRvcihTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uICB7Ci0JCXJldHVybiAoSVZhbGlkYXRvcilsb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBpZGVudGlmaWVkIGJ5IHRoZSBjbGFzc05hbWUgcGFyYW1ldGVyLAotCSAqIHdoaWNoIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxvYWRDbGFzcyBhcmd1bWVudCBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCXJldHVybiBjbGF6ei5uZXdJbnN0YW5jZSgpOwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgRmlsZXN5c3RlbU1hbmFnZXIgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZXN5c3RlbU1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYoX2luc3QgPT0gbnVsbCkgewotCQkJX2luc3QgPSBuZXcgRmlsZXN5c3RlbU1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gX2luc3Q7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gYXJyYXkgb2YgZmlsZSBuYW1lcywgcmV0dXJuIGFuIGFycmF5IG9mIElGaWxlRGVsdGEKLQkgKiBpbnN0YW5jZXMgdG8gcGFzcyB0byB0aGUgdmFsaWRhdG9yIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJRmlsZURlbHRhW10gZ2V0RmlsZURlbHRhcyhTdHJpbmdbXSBmaWxlTmFtZXMpIHsKLQkJaWYoKGZpbGVOYW1lcyA9PSBudWxsKSB8fCAoZmlsZU5hbWVzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUZpbGVEZWx0YVtdIGZpbGVzID0gbmV3IEZpbGVEZWx0YVtmaWxlTmFtZXMubGVuZ3RoXTsKLQkJZm9yKGludCBpPTA7IGk8ZmlsZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaWxlc1tpXSA9IG5ldyBGaWxlRGVsdGEoZmlsZU5hbWVzW2ldLCBJRmlsZURlbHRhLkNIQU5HRUQpOwotCQl9Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYW4gYXJyYXkgb2YgSUZpbGVEZWx0YSBpbnN0YW5jZXMsIHJldHVybiBhbiBhcnJheQotCSAqIG9mIHRoZSBJVmFsaWRhdG9yIGluc3RhbmNlcywgd2l0aCB0aGVpciBhc3NvY2lhdGVkIElWYWxpZGF0aW9uQ29udGV4dCBpbnN0YW5jZXMsCi0JICogdGhhdCB2YWxpZGF0ZSB0aGVzZSBwYXJ0aWN1bGFyIGRlbHRhIGluc3RhbmNlcy4KLQkgKi8KLQlwdWJsaWMgRmlsZXN5c3RlbUxvYWRlcltdIGdldExvYWRlcnMoSUZpbGVEZWx0YVtdIGRlbHRhcykgewotCQlpZihkZWx0YXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEFsbExvYWRlcnMoKTsKLQkJfQotCi0JCVNldCBsb2FkZXJzID0gbmV3IEhhc2hTZXQoKTsJCQotCQlmb3IoaW50IGk9MDsgaTxkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGVzeXN0ZW1Mb2FkZXJbXSBsb2FkZXJBcnJheSA9IGdldExvYWRlcnNGb3IoZGVsdGFzW2ldKTsKLQkJCWlmKGxvYWRlckFycmF5ICE9IG51bGwpIHsKLQkJCQlmb3IoaW50IGo9MDsgajxsb2FkZXJBcnJheS5sZW5ndGg7IGorKykgewotCQkJCQlsb2FkZXJzLmFkZChsb2FkZXJBcnJheVtqXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlGaWxlc3lzdGVtTG9hZGVyW10gcmVzdWx0ID0gbmV3IEZpbGVzeXN0ZW1Mb2FkZXJbbG9hZGVycy5zaXplKCldOwotCQlsb2FkZXJzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYW4gSVZhbGlkYXRvciBpbnN0YW5jZSwgcmV0dXJuIHRoZSBJVmFsaWRhdGlvbkNvbnRleHQgaW5zdGFuY2UgdGhhdCB0aGUKLQkgKiBJVmFsaWRhdG9yIHVzZXMgdG8gbG9hZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlc3lzdGVtIHZhbGlkYXRpb24KLQkgKiBmcmFtZXdvcmsgZW52aXJvbm1lbnQuCi0JICovCi0JcHVibGljIElGaWxlc3lzdGVtSGVscGVyIGdldEhlbHBlcihJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZih2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX2xvYWRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlGaWxlc3lzdGVtTG9hZGVyIGxvYWRlciA9IChGaWxlc3lzdGVtTG9hZGVyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKHZhbGlkYXRvci5lcXVhbHMobG9hZGVyLmdldFZhbGlkYXRvcigpKSkgewotCQkJCXJldHVybiBsb2FkZXIuZ2V0SGVscGVyKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHZhbGlkYXRvciwgcmV0dXJuIHRoZSBJVmFsaWRhdG9yIGluc3RhbmNlLgotCSAqIG51bGwgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgSVZhbGlkYXRvciBjYW5ub3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpIHsKLQkJaWYodmFsaWRhdG9yQ2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9sb2FkZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRmlsZXN5c3RlbUxvYWRlciBsb2FkZXIgPSAoRmlsZXN5c3RlbUxvYWRlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZih2YWxpZGF0b3JDbGFzc05hbWUuZXF1YWxzKGxvYWRlci5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gbG9hZGVyLmdldFZhbGlkYXRvcigpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIGFsbCBGaWxlc3lzdGVtTG9hZGVyIGluc3RhbmNlcy4gRWFjaCBsb2FkZXIgaGFzCi0JICogb25lIElWYWxpZGF0b3IgYW5kIG9uZSBJVmFsaWRhdGlvbkNvbnRleHQuCi0JICovCi0JcHVibGljIEZpbGVzeXN0ZW1Mb2FkZXJbXSBnZXRBbGxMb2FkZXJzKCkgewotCQlGaWxlc3lzdGVtTG9hZGVyW10gcmVzdWx0ID0gbmV3IEZpbGVzeXN0ZW1Mb2FkZXJbX2xvYWRlcnMuc2l6ZSgpXTsKLQkJX2xvYWRlcnMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgZmlsZSBuYW1lLCByZXR1cm4gdGhlIGxvYWRlciB3aGljaCBjb250YWlucyB0aGUgdmFsaWRhdG9yICYgaGVscGVyCi0JICogd2hpY2ggY2FuIHZhbGlkYXRlIHRoYXQgZmlsZSwgaWYgb25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgRmlsZXN5c3RlbUxvYWRlcltdIGdldExvYWRlcnNGb3IoSUZpbGVEZWx0YSBkZWx0YSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9sb2FkZXJzLml0ZXJhdG9yKCk7Ci0JCUZpbGVzeXN0ZW1Mb2FkZXJbXSB0ZW1wTG9hZGVycyA9IG5ldyBGaWxlc3lzdGVtTG9hZGVyW19sb2FkZXJzLnNpemUoKV07Ci0JCWludCBjb3VudCA9IDA7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRmlsZXN5c3RlbUxvYWRlciBsb2FkZXIgPSAoRmlsZXN5c3RlbUxvYWRlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmdbXSBmaWxlRXh0ZW5zaW9ucyA9IGxvYWRlci5nZXRGaWxlRXh0ZW5zaW9ucygpOwotCQkJaWYoZmlsZUV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlmb3IoaW50IGk9MDsgaTxmaWxlRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmKGRlbHRhLmdldEZpbGVOYW1lKCkuZW5kc1dpdGgoZmlsZUV4dGVuc2lvbnNbaV0pICYmIChkZWx0YS5nZXREZWx0YVR5cGUoKSA9PSBJRmlsZURlbHRhLkFEREVEIHx8IGRlbHRhLmdldERlbHRhVHlwZSgpID09IElGaWxlRGVsdGEuQ0hBTkdFRCB8fCBkZWx0YS5nZXREZWx0YVR5cGUoKSA9PSBJRmlsZURlbHRhLkRFTEVURUQpKSB7Ci0JCQkJCXRlbXBMb2FkZXJzW2NvdW50KytdID0gbG9hZGVyOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJRmlsZXN5c3RlbUxvYWRlcltdIHJlc3VsdCA9IG5ldyBGaWxlc3lzdGVtTG9hZGVyW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTG9hZGVycywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9GdWxsUmVwb3J0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0Z1bGxSZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTU5YjJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0Z1bGxSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgcmVwb3J0ZXIgaXMgdXNlZCB3aGVuIGZ1bGwgdmFsaWRhdGlvbiBpcyBuZWVkZWQuIEl0IGRvZXNuJ3QgY2FjaGUKLSAqIGFueXRoaW5nLCBzbyBpdCdzIGZhc3RlciB0aGFuIHRoZSBJbmNyZW1lbnRhbFJlcG9ydGVyLgotICovCi1wdWJsaWMgY2xhc3MgRnVsbFJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKLQlwdWJsaWMgRnVsbFJlcG9ydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI2FkZE1lc3NhZ2UoSVZhbGlkYXRvciwgSU1lc3NhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZU1hbmFnZXIuZm9ybWF0TWVzc2FnZSh2YWxpZGF0b3IsIG1lc3NhZ2UpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciwgSU1lc3NhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJLy8gRmx1c2ggdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXIgaW1tZWRpYXRlbHkuCi0JCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlLmdldFRleHQoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI2dldE1lc3NhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpIHsKLQkJLy8gdGhpcyByZXBvcnRlciBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2UgYWNjZXNzIAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjaXNDYW5jZWxsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQkvLyB0byBtYWtlIHRoaW5ncyBlYXN5LCBkbyBub3QgYWxsb3cgdGhlIHVzZXIgdG8gY2FuY2VsIHZhbGlkYXRpb24uCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQkvLyBzaW5jZSBubyBtZXNzYWdlcyBhcmUgc3RvcmVkLCB0aGVyZSdzIG5vdGhpbmcgdG8gcmVtb3ZlCi0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCkgewotCQkvLyBzaW5jZSBubyBtZXNzYWdlcyBhcmUgc3RvcmVkLCB0aGVyZSdzIG5vdGhpbmcgdG8gcmVtb3ZlCi0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlbW92ZU1lc3NhZ2VTdWJzZXQoSVZhbGlkYXRvciwgT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQkvLyBTaW5jZSB0aGlzIHJlcG9ydGVyIGRvZXNuJ3Qgc3RvcmUgbWVzc2FnZXMsIHRoZXJlIGlzIG5vIHJlbW92YWwgb2YgYW55IG1lc3NhZ2VzCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vSUZpbGVzeXN0ZW1IZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0lGaWxlc3lzdGVtSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Mzg1MTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vSUZpbGVzeXN0ZW1IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW07Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiBUbyBpbnRlZ3JhdGUgYSB2YWxpZGF0b3IgaW50byB0aGlzIGZyYW1ld29yaywgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICogSVZhbGlkYXRpb25Db250ZXh0IG11c3QgYmUgcHJvdmlkZWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbGVzeXN0ZW1IZWxwZXIgZXh0ZW5kcyBJVmFsaWRhdGlvbkNvbnRleHQgewotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZpbGUgd2hpY2ggdGhlIElNZXNzYWdlIGlzIHJlcG9ydGVkIGFnYWluc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShJTWVzc2FnZSBtZXNzYWdlKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0luY3JlbWVudGFsUmVwb3J0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0luY3JlbWVudGFsUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlM2RiYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9JbmNyZW1lbnRhbFJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBmaWxlIHN5c3RlbSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhbiBpbmNyZW1lbnRhbCBJUmVwb3J0ZXIuCi0gKiBJdCBjYWNoZXMgdmFsaWRhdGlvbiBtZXNzYWdlcywgc28gdGhhdCBtZXNzYWdlcyBjYW4gYm90aCBiZSBhZGRlZCBhbmQgZGVsZXRlZC4KLSAqLwotcHVibGljIGNsYXNzIEluY3JlbWVudGFsUmVwb3J0ZXIgaW1wbGVtZW50cyBJUmVwb3J0ZXIgewotCQotCXB1YmxpYyBJbmNyZW1lbnRhbFJlcG9ydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNhZGRNZXNzYWdlKElWYWxpZGF0b3IsIElNZXNzYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXNzYWdlcyB2bSA9IE1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQlpZiAodm0gIT0gbnVsbCkgewotCQkJdm0uYWRkVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yLCBJTWVzc2FnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQkvLyBGbHVzaCB0aGUgbWVzc2FnZSB0byB0aGUgdXNlciBpbW1lZGlhdGVseS4KLQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNnZXRNZXNzYWdlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIE1hcCBvZiBTdHJpbmcgZnVsbHktcXVhbGlmaWVkIHZhbGlkYXRvciBjbGFzcyBuYW1lcywKLQkgKiB3aXRoIGEgdmFsdWUgb2YgQ29sbGVjdGlvbiwgYW5kIHRoZSBDb2xsZWN0aW9uIGNvbnRhaW5zIHRoZQotCSAqIE1lc3NhZ2VNZXRhRGF0YSByZXBvcnRlZCBieSB0aGUgdmFsaWRhdG9yLCBvZiB0aGUgZ2l2ZW4gc2V2ZXJpdHkuCi0JICovCi0JcHVibGljIE1hcCBnZXRNZXNzYWdlcyhpbnQgbWVzc2FnZVR5cGUpIHsKLQkJcmV0dXJuIE1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRNZXNzYWdlcyhtZXNzYWdlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjaXNDYW5jZWxsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQkvLyBGb3Igc2ltcGxpY2l0eSwgbmV2ZXIgYWxsb3cgY2FuY2VsbGF0aW9uLgotCQkvLyBJbiBhIHByb2R1Y3Rpb24gc3lzdGVtLCB0aGlzIG1ldGhvZCBtaWdodCBxdWVyeSBhbm90aGVyIG9iamVjdCB0byBmaW5kIG91dCBpdHMgY2FuY2VsbGF0aW9uIHN0YXR1cy4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTWVzc2FnZU1hbmFnZXIuZ2V0TWFuYWdlcigpLnJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCi0JCU1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5yZW1vdmVBbGxNZXNzYWdlcyh2YWxpZGF0b3IsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yLCBPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlU3Vic2V0KElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqLCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCS8vIGltcGxlbWVudCBsYXRlcgotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgYSBmb3JtYXR0ZWQgbGlzdCBvZiBhbGwgb2YgdGhlIHByb2JsZW1zIGZvdW5kIHdoaWxlCi0JICogdmFsaWRhdGluZyB0aGUgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG1lc3NhZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJTWFwIG1lc3NhZ2VzID0gZ2V0TWVzc2FnZXMoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSk7Ci0JCXJlcG9ydChtZXNzYWdlcyk7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZyBtZXNzYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCW1lc3NhZ2VzID0gZ2V0TWVzc2FnZXMoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKTsKLQkJcmVwb3J0KG1lc3NhZ2VzKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJJbmZvcm1hdGlvbiBtZXNzYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCW1lc3NhZ2VzID0gZ2V0TWVzc2FnZXMoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZKTsKLQkJcmVwb3J0KG1lc3NhZ2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjcmVwb3J0KE1hcCkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVwb3J0KE1hcCBtZXNzYWdlcykgewotCQlpZihtZXNzYWdlcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSA9IChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBGaWxlc3lzdGVtTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yKHZhbGlkYXRvckNsYXNzTmFtZSk7Ci0JCQlJRmlsZXN5c3RlbUhlbHBlciBoZWxwZXIgPSBGaWxlc3lzdGVtTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0SGVscGVyKHZhbGlkYXRvcik7Ci0JCQlMaXN0IG1zc2dMaXN0ID0gKExpc3QpbWVzc2FnZXMuZ2V0KHZhbGlkYXRvcik7Ci0JCQlpZihtc3NnTGlzdCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCUNvbGxlY3Rpb25zLnNvcnQobXNzZ0xpc3QsIE1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRNZXNzYWdlQ29tcGFyYXRvcihoZWxwZXIpKTsKLQkJCQotCQkJZm9yKGludCBpPTA7IGk8bXNzZ0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlJTWVzc2FnZSBtc3NnID0gKElNZXNzYWdlKW1zc2dMaXN0LmdldChpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZU1hbmFnZXIuZm9ybWF0TWVzc2FnZSh2YWxpZGF0b3IsIG1zc2cpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL01lc3NhZ2VNYW5hZ2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9NZXNzYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGIxYzllLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL01lc3NhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcyBmb3IgZWFjaCB2YWxpZGF0b3IuIEVhY2ggdmFsaWRhdG9yJ3MKLSAqIG1lc3NhZ2VzIGNhbiBiZSByZXRyaWV2ZWQgYnkgdXNpbmcgdGhlIHZhbGlkYXRvcidzIHVuaXF1ZSBuYW1lIGFzIGEga2V5IGludG8gdGhlCi0gKiB0YWJsZS4gKGkuZS4sIGNhbGwgZ2V0TWVzc2FnZXMgd2l0aCB0aGUgdmFsaWRhdG9yJ3MgdW5pcXVlIG5hbWUgYXMgdGhlIHBhcmFtZXRlci4pCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZU1hbmFnZXIgX3NpbmdsZXRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIF9jb21wYXJhdG9yID0gbnVsbDsKLQotCXByaXZhdGUgTWFwIF92YWxpZGF0aW9uTWVzc2FnZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBNZXNzYWdlTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQotCQlfdmFsaWRhdGlvbk1lc3NhZ2VzID0gbmV3IEhhc2hNYXAoMTApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgTWVzc2FnZU1hbmFnZXIgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZU1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKF9zaW5nbGV0b24gPT0gbnVsbCkgewotCQkJX3NpbmdsZXRvbiA9IG5ldyBNZXNzYWdlTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBfc2luZ2xldG9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBtYXAgb2YgYWxsIG1lc3NhZ2VzIG9mIHRoZSBnaXZlbiBzZXZlcml0eS4gVGhlIGtleSBvZiB0aGUgbWFwCi0JICogaXMgdGhlIElWYWxpZGF0b3IsIHRoZSB2YWx1ZSBvZiB0aGUgSVZhbGlkYXRvciBpcyB0aGUgTGlzdCBvZiBJTWVzc2FnZQotCSAqIGluc3RhbmNlcyBvZiB0aGUgZ2l2ZW4gc2V2ZXJpdHkuCi0JICovCi0JcHVibGljIE1hcCBnZXRNZXNzYWdlcyhpbnQgbWVzc2FnZVR5cGVzKSB7Ci0JCU1hcCBtZXNzYWdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdmFsaWRhdGlvbk1lc3NhZ2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmFsaWRhdG9yTWVzc2FnZXMgbXNzZyA9IChWYWxpZGF0b3JNZXNzYWdlcykgaXRlcmF0b3IubmV4dCgpOwotCi0JCQltZXNzYWdlcy5wdXQobXNzZy5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKSwgbXNzZy5nZXRNZXNzYWdlcyhtZXNzYWdlVHlwZXMpKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZXM7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIFZhbGlkYXRpb25NZXNzYWdlIG93bmVkIGJ5IHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvciwKLQkgKiBpZiBvbmUgZXhpc3RzLiBJZiBvbmUgZG9lc24ndCBleGlzdCwgaXQgaXMgY3JlYXRlZCAmIHJlZ2lzdGVyZWQsIGFuZCB0aGVuIAotCSAqIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXNzYWdlcyBnZXRNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVmFsaWRhdG9yTWVzc2FnZXMgbWVzc2FnZSA9IChWYWxpZGF0b3JNZXNzYWdlcykgX3ZhbGlkYXRpb25NZXNzYWdlcy5nZXQodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJLy8gaWYgaXQgZG9lc24ndCBleGlzdCwgY3JlYXRlIGl0LgotCQkJbWVzc2FnZSA9IG5ldyBWYWxpZGF0b3JNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQkJX3ZhbGlkYXRpb25NZXNzYWdlcy5wdXQodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBtZXNzYWdlKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBtZXNzYWdlcyBvd25lZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlfdmFsaWRhdGlvbk1lc3NhZ2VzLnJlbW92ZSh2YWxpZGF0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgYWxsIG1lc3NhZ2VzLCBvd25lZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IsIHJlcG9ydGVkCi0JICogYWdhaW5zdCB0aGUgZ2l2ZW4gdGFyZ2V0IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRvck1lc3NhZ2VzIG1lc3NhZ2UgPSBnZXRNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlLnJlbW92ZUFsbE1lc3NhZ2VzKG9iamVjdCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IKLQkgKiBtYXkgYXNzaWduIGdyb3VwIG5hbWVzIHRvIElNZXNzYWdlcy4gQW4gSU1lc3NhZ2Ugc3Vic2V0IHdpbGwgYmUgaWRlbnRpZmllZAotCSAqIGJ5IHRoZSBuYW1lIG9mIGl0cyBncm91cC4gRGVmYXVsdCAobnVsbCkgbWVhbnMgbm8gZ3JvdXAuIFRoaXMgbWV0aG9kIHdpbGwKLQkgKiByZW1vdmUgb25seSB0aGUgSU1lc3NhZ2UncyB0aGF0IGFyZSBpbiB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSBncm91cE5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRvck1lc3NhZ2VzIG1lc3NhZ2UgPSBnZXRNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlLnJlbW92ZUFsbE1lc3NhZ2VzKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElNZXNzYWdlIGFzIGEgU3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5aW5nIHRvIHRoZSB1c2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE1lc3NhZ2UoSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBtZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0JCU9iamVjdCBvYmplY3QgPSBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpOwotCQlTdHJpbmdCdWZmZXIgZm9ybWF0dGVkTWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3dpdGNoIChzZXZlcml0eSkgewotCQkJY2FzZSAoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSkgOgotCQkJCXsKLQkJCQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQoIkVycm9yOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLkxPV19TRVZFUklUWSkgOgotCQkJCXsKLQkJCQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQoIkluZm9ybWF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSkgOgotCQkJZGVmYXVsdCA6Ci0JCQkJewotCQkJCQlmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZCgiV2FybmluZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQl9Ci0KLQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQobWVzc2FnZS5nZXRUZXh0KCkpOwotCi0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZXN5c3RlbU1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEhlbHBlcih2YWxpZGF0b3IpLmdldEZpbGVOYW1lKG1lc3NhZ2UpOwotCQkJaW50IGxpbmVOdW1iZXIgPSBtZXNzYWdlLmdldExpbmVOdW1iZXIoKTsKLQotCQkJaWYoKGZpbGVOYW1lICE9IG51bGwpIHx8IChsaW5lTnVtYmVyICE9IElNZXNzYWdlLkxJTkVOT19VTlNFVCkpIHsKLQkJCQlmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZCgiWyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJCQlmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZChmaWxlTmFtZSk7Ci0JCQkJfQotCQkJCWlmKGxpbmVOdW1iZXIgIT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSB7Ci0JCQkJCWZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKCIgbGluZSBudW1iZXI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGxpbmVOdW1iZXIpKTsKLQkJCQl9Ci0JCQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQoIl0gIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmb3JtYXR0ZWRNZXNzYWdlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBDb21wYXJhdG9yIGlzIHVzZWQgdG8gc29ydCBtZXNzYWdlcyBmaXJzdCBieSBmaWxlIG5hbWUsIHRoZW4gYnkgbGluZSBudW1iZXIuCi0JICovCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0TWVzc2FnZUNvbXBhcmF0b3IoZmluYWwgSUZpbGVzeXN0ZW1IZWxwZXIgaGVscGVyKSB7Ci0JCWlmKF9jb21wYXJhdG9yID09IG51bGwpIHsKLQkJCV9jb21wYXJhdG9yID0gCW5ldyBDb21wYXJhdG9yKCkgewotCQkJCXByb3RlY3RlZCBpbnQgY29tcGFyZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQkJCXJldHVybiAwOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQkJCXJldHVybiAxOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gYS5jb21wYXJlVG8oYik7Ci0JCQkJfQotCQkJCQotCQkJCXByb3RlY3RlZCBpbnQgY29tcGFyZShpbnQgYSwgaW50IGIpIHsKLQkJCQkJaWYoKGEgPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSAmJiAoYiA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQkJCQllbHNlIGlmKGEgPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSB7Ci0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihiID09IElNZXNzYWdlLkxJTkVOT19VTlNFVCkgewotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiAoYSAtIGIpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkJCWlmKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQkJCQllbHNlIGlmKGEgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJSU1lc3NhZ2UgYU1zc2cgPSAoSU1lc3NhZ2UpYTsKLQkJCQkJSU1lc3NhZ2UgYk1zc2cgPSAoSU1lc3NhZ2UpYjsKLQkJCQkJCi0JCQkJCS8vIFNvcnQgYnkgZmlsZSBuYW1lLCB0aGVuIGxpbmUgbnVtYmVyLiBVbnNldCBsaW5lIG51bWJlcnMgZ28gdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaXN0LgotCQkJCQlTdHJpbmcgYUZpbGVOYW1lID0gaGVscGVyLmdldEZpbGVOYW1lKGFNc3NnKTsKLQkJCQkJU3RyaW5nIGJGaWxlTmFtZSA9IGhlbHBlci5nZXRGaWxlTmFtZShiTXNzZyk7Ci0JCQkJCWludCByZXN1bHQgPSBjb21wYXJlKGFGaWxlTmFtZSwgYkZpbGVOYW1lKTsKLQkJCQkJaWYocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWludCBhTGluZU51bWJlciA9IGFNc3NnLmdldExpbmVOdW1iZXIoKTsKLQkJCQkJaW50IGJMaW5lTnVtYmVyID0gYk1zc2cuZ2V0TGluZU51bWJlcigpOwotCQkJCQlyZXR1cm4gY29tcGFyZShhTGluZU51bWJlciwgYkxpbmVOdW1iZXIpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIF9jb21wYXJhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL1ZhbGlkYXRvck1lc3NhZ2VzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9WYWxpZGF0b3JNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzE2ZGYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL1ZhbGlkYXRvck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIG1lc3NhZ2VzIGZvciBvbmUgdmFsaWRhdG9yLiBFYWNoIHZhbGlkYXRvciAKLSAqIGNhbiBzdG9yZSB0aHJlZSB0eXBlcyBvZiBtZXNzYWdlczogZXJyb3IgKFNldmVyaXR5RW51bS5ISUdIX1NFVkVSSVRZKSwgCi0gKiB3YXJuaW5nIChTZXZlcml0eUVudW0uTk9STUFMX1NFVkVSSVRZKSwgYW5kIGluZm8gKFNldmVyaXR5RW51bS5MT1dfU0VWRVJJVFkpLgotICogRWFjaCBtZXNzYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBPYmplY3QgKGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uKS4KLSAqIElmIGEgbWVzc2FnZSBkb2VzIG5vdCBhcHBseSB0byBhIHBhcnRpY3VsYXIgT2JqZWN0LCB0aGUgZGVmYXVsdCBPYmplY3QKLSAqIGlzIHVzZWQuCi0gKgotICogRWFjaCBPYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGVpdGhlciAwLCAxLCBvciA+MSBtZXNzYWdlcy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBNYXAgX21lc3NhZ2VzID0gbnVsbDsKLQlwcml2YXRlIElWYWxpZGF0b3IgX3ZhbGlkYXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgREVGQVVMVF9PQkpFQ1QgPSBuZXcgT2JqZWN0KCk7Ci0KLQlwdWJsaWMgVmFsaWRhdG9yTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJX21lc3NhZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJX3ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWxpZGF0b3IgdGhhdCBvd25zIHRoZXNlIG1lc3NhZ2VzLgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIF92YWxpZGF0b3I7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBhbiBJTWVzc2FnZSB0byB0aGUgZGVmYXVsdCBncm91cC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWFkZFZhbGlkYXRpb25NZXNzYWdlKG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYW4gSU1lc3NhZ2UgdG8gdGhlIG5hbWVkIGdyb3VwLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKElNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBncm91cE5hbWUpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG1lc3NhZ2UuZ2V0VGFyZ2V0T2JqZWN0KCkgPT0gbnVsbCkgewotCQkJLy8gSWYgb2JqZWN0IGlzIG51bGwsIHRoZSBlcnJvciBtZXNzYWdlIGRvZXMgbm90IGFwcGx5IHRvIGEgcGFydGljdWxhciBvYmplY3QuCi0JCQkvLwotCQkJLy8gVGhpcyB2YWx1ZSBtaWdodCBiZSB1c2VkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIHZhbGlkYXRvciBleHBlcmllbmNlcyBhbiBpbnRlcm5hbCwgdW5yZWNvdmVyYWJsZSBlcnJvci4KLQkJCS8vIFlvdSBuZWVkIHRvIGxldCB0aGUgdXNlciBrbm93IHRoYXQgdmFsaWRhdGlvbiB0ZXJtaW5hdGVkIGFibm9ybWFsbHksIGJ1dCBhIGxpc3QKLQkJCS8vIG9mIHRoZSB2YWxpZGF0aW9uIHdoaWNoIHByb2NlZWRlZCBub3JtYWxseSBjYW4gaGVscCB0byBuYXJyb3cgZG93biB3aGF0IHBhcnQgb2YgdGhlCi0JCQkvLyBjb2RlIGNhdXNlZCBhIHByb2JsZW0uCi0JCQkvLwotCQkJLy8gT3IgaXQgY291bGQgYmUgc29tZXRoaW5nIGdlbmVyaWMsIGUuZy4gaXQgYXBwbGllcyB0byBhIC5qYXIgZmlsZSwgaW5zdGVhZCBvZiBhIGZpbGUgaW4gdGhlIC5qYXIuCi0JCQltZXNzYWdlLnNldFRhcmdldE9iamVjdChnZXREZWZhdWx0T2JqZWN0KCkpOwotCQl9Ci0JCQotCQlpZihncm91cE5hbWUgIT0gbnVsbCkgewotCQkJbWVzc2FnZS5zZXRHcm91cE5hbWUoZ3JvdXBOYW1lKTsKLQkJfQotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBfbWVzc2FnZXMuZ2V0KG1lc3NhZ2UuZ2V0VGFyZ2V0T2JqZWN0KCkpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWxpc3QuYWRkKG1lc3NhZ2UpOwotCQlfbWVzc2FnZXMucHV0KG1lc3NhZ2UuZ2V0VGFyZ2V0T2JqZWN0KCksIGxpc3QpOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgSU1lc3NhZ2UgZG9lcyBub3QgaGF2ZSBhIHRhcmdldCBvYmplY3QsIHRoZSBvYmplY3QKLQkgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIE1hcC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREZWZhdWx0T2JqZWN0KCkgewotCQlyZXR1cm4gREVGQVVMVF9PQkpFQ1Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbGwgbWVzc2FnZXMgd2hvc2Ugc2V2ZXJpdHkgbWF0Y2hlcyB0aGUgbWVzc2FnZVR5cGVzIHNldmVyaXR5LgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKGludCBtZXNzYWdlVHlwZXMpIHsKLQkJTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9tZXNzYWdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlPYmplY3RbXSBsaXN0Q29udGVudHMgPSBsaXN0LnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdENvbnRlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IChJTWVzc2FnZSkgbGlzdENvbnRlbnRzW2ldOwotCi0JCQkJaWYgKChtZXNzYWdlVHlwZXMgJiBtZXNzYWdlLmdldFNldmVyaXR5KCkpICE9IDApIHsKLQkJCQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWVzc2FnZXM7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhbGwgbWVzc2FnZXMgdGhhdCBhcHBseSB0byB0aGUgZ2l2ZW4gb2JqZWN0LiBJZiBvYmplY3QgaXMKLQkgKiBudWxsLCB0aGUgbWVzc2FnZXMgb3duZWQgYnkgdGhlIGRlZmF1bHQgb2JqZWN0IGFyZSByZW1vdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlvYmplY3QgPSBnZXREZWZhdWx0T2JqZWN0KCk7Ci0JCX0KLQotCQlfbWVzc2FnZXMucmVtb3ZlKG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhbGwgbWVzc2FnZXMgdGhhdCBhcHBseSB0byB0aGUgZ2l2ZW4gb2JqZWN0IHdoaWNoIGFyZSBpbgotCSAqIHRoZSBuYW1lZCBncm91cC4gSWYgT2JqZWN0IGlzIG51bGwsIHRoZSBkZWZhdWx0IG9iamVjdCBpcyB1c2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlpZiAoZ3JvdXBOYW1lID09IG51bGwpIHsKLQkJCXJlbW92ZUFsbE1lc3NhZ2VzKG9iamVjdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCW9iamVjdCA9IGdldERlZmF1bHRPYmplY3QoKTsKLQkJfQotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBfbWVzc2FnZXMuZ2V0KG9iamVjdCk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChsaXN0LnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSU1lc3NhZ2UgbXNnID0gKElNZXNzYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgbXNnR3JvdXBOYW1lID0gbXNnLmdldEdyb3VwTmFtZSgpOwotCQkJaWYgKGdyb3VwTmFtZS5lcXVhbHMobXNnR3JvdXBOYW1lKSkgewotCQkJCWxpc3QucmVtb3ZlKG1zZyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjA4ZDAyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUiCi0gICBuYW1lPSJQcm9wZXJ0aWVzIFZhbGlkYXRvciIKLSAgIHZlcnNpb249IjEuMS4wIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS53b3JrYmVuY2hpbXBsLlByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gUHJvcGVydGllcyBWYWxpZGF0b3IgQ29udHJpYnV0aW9ucyAgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJQcm9wZXJ0aWVzVmFsaWRhdG9yIgotICAgICAgICAgbmFtZT0iUHJvcGVydGllcyBWYWxpZGF0b3IiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgICA8cHJvamVjdE5hdHVyZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiPgotICAgICAgICAgPC9wcm9qZWN0TmF0dXJlPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgYWN0aW9uPSJhZGQsIGNoYW5nZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGVuYWJsZWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgYXN5bmM9ImZhbHNlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5Qcm9wZXJ0aWVzVmFsaWRhdG9yIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgICAgPGhlbHBlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS53b3JrYmVuY2hpbXBsLlByb3BlcnRpZXNIZWxwZXIiPgotICAgICAgICAgPC9oZWxwZXI+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBWYWxpZGF0aW9uIERvY3VtZW50YXRpb24gICAgICAgICAgICAgIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBWYWxpZGF0b3IgRGV2ZWxvcGVyJ3MgR3VpZGUgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MKLSAgICAgICAgICAgIGZpbGU9ImRvYy9kZXZlbG9wZXJHdWlkZS90b2MueG1sIgotICAgICAgICAgICAgcHJpbWFyeT0idHJ1ZSI+Ci0gICAgICA8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFZhbGlkYXRpb24gR3VpZGUgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgPHRvYwotICAgICAgICAgICAgZmlsZT0iZG9jL2d1aWRlL3RvYy54bWwiCi0gICAgICAgICAgICBwcmltYXJ5PSJ0cnVlIj4KLSAgICAgIDwvdG9jPgotICAgPC9leHRlbnNpb24+Ci0tLT4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcC5iYXQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmY5NDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3AuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi1SRU0gKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotUkVNIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi1SRU0gcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotUkVNIAotUkVNIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLVJFTSBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotUkVNIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLVJFTSBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLVJFTSB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLVJFTSAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi1SRU0gTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLVJFTSBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLVJFTSBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLVJFTSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi1SRU0gaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotUkVNIAotUkVNIFRoaXMgYmF0Y2ggZmlsZSBmaXJlcyBvZmYgdGhlIHByb3BlcnR5IGZpbGUgcGFyc2Ugb3IgY29tcGFyaXNvbi4KLVJFTQotc2V0bG9jYWwKLQotaWYgIiVKQVZBX0hPTUUlIiBFUVUgIiIgZ290byBOT19KQVZBCi0KLXNldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7Li5cY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5jb3JlXzUuMS4wXHJ1bnRpbWVcY29tbW9uLmphcgotc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTsuXHJ1bnRpbWVccHJvcGVydGllc1ZhbGlkYXRvci5qYXIKLWlmICIlMSIgPT0gIiIgZ290byBzeW50YXgKLQotJUpBVkFfSE9NRSVcYmluXGphdmEgY29tLmlibS5ldG9vbHMucGFyc2VyLk1haW4gJTEgJTIgJTMKLWdvdG8gOmVuZAotCi06Tk9fSkFWQQotZWNoby4KLWVjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGJlIHNldCB0byB0aGUgSlJFIGRpcmVjdG9yeS4KLWVjaG8gZS5nLiwgc2V0IEpBVkFfSE9NRT1DOlxKUkUKLWVjaG8gd2hlcmUgSlJFIGhhcyBhIHN1YmRpcmVjdG9yeSBuYW1lZCAiYmluIgotZWNoby4KLWdvdG8gOmVuZAotCi06c3ludGF4Ci0lSkFWQV9IT01FJVxiaW5camF2YSBjb20uaWJtLmV0b29scy5wYXJzZXIuTWFpbgotCi06ZW5kCi1lbmRsb2NhbAotQGVjaG8gb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbEZTL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtaW1wbC9GaWxlc3lzdGVtUHJvcGVydGllc0hlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxGUy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbWltcGwvRmlsZXN5c3RlbVByb3BlcnRpZXNIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiYmZiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbEZTL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtaW1wbC9GaWxlc3lzdGVtUHJvcGVydGllc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW1pbXBsOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuUE1vZGVsRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbS5JRmlsZXN5c3RlbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLkFQcm9wZXJ0eUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5Qcm9wZXJ0eUxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5GaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgSVZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudGF0aW9uLCB1c2VkIGJ5IHRoZSBQcm9wZXJ0aWVzVmFsaWRhdG9yLAotICogd2hlbiB0aGUgdmFsaWRhdG9yIGlzIHJ1biBpbiB0aGUgZmlsZXN5c3RlbSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVzeXN0ZW1Qcm9wZXJ0aWVzSGVscGVyIGltcGxlbWVudHMgSUZpbGVzeXN0ZW1IZWxwZXIgewotCXB1YmxpYyBGaWxlc3lzdGVtUHJvcGVydGllc0hlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5JVmFsaWRhdGlvbkNvbnRleHQjbG9hZE1vZGVsKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCXJldHVybiBsb2FkTW9kZWwoc3ltYm9saWNOYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5JVmFsaWRhdGlvbkNvbnRleHQjbG9hZE1vZGVsKFN0cmluZywgT2JqZWN0W10pCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSwgT2JqZWN0W10gcGFybSkgewotCQlpZiAoKHN5bWJvbGljTmFtZSA9PSBudWxsKSB8fCAoc3ltYm9saWNOYW1lLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoUE1vZGVsRW51bS5MSU5FSU5QVVRSRUFERVIpICYmIChwYXJtICE9IG51bGwpICYmIChwYXJtLmxlbmd0aCA9PSAxKSAmJiAocGFybVswXSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCXJldHVybiBsb2FkTGluZU51bWJlclJlYWRlcigoU3RyaW5nKSBwYXJtWzBdKTsKLQkJfQotCQllbHNlIGlmIChzeW1ib2xpY05hbWUuZXF1YWxzKFBNb2RlbEVudW0uUkVMRUFTRV9MSU5FSU5QVVRSRUFERVIpICYmIChwYXJtICE9IG51bGwpICYmIChwYXJtLmxlbmd0aCA9PSAxKSAmJiAocGFybVswXSBpbnN0YW5jZW9mIExpbmVOdW1iZXJSZWFkZXIpKSB7Ci0JCQlyZXR1cm4gcmVsZWFzZUxpbmVOdW1iZXJSZWFkZXIoKExpbmVOdW1iZXJSZWFkZXIpIHBhcm1bMF0pOwotCQl9Ci0JCWVsc2UgaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoUE1vZGVsRW51bS5BTExfUFJPUEVSVElFU19GSUxFUykpIHsKLQkJCXJldHVybiBsb2FkQWxsUHJvcGVydGllc0ZpbGVzKCk7Ci0JCX0KLQkJZWxzZSBpZihzeW1ib2xpY05hbWUuZXF1YWxzKFBNb2RlbEVudW0uRklMVEVSKSkgewotCQkJLy8gQmVjYXVzZSB0aGlzIGVudmlyb25tZW50IGRvZXMgbm90IGNvcHkgcmVzb3VyY2VzIGludG8gYSAiYmluIiBkaXJlY3RvcnksCi0JCQkvLyB0aGUgaW5wdXQgaXMgYWxyZWFkeSBmaWx0ZXJlZC4KLQkJCXJldHVybiBwYXJtOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgZmlsZSBuYW1lIG9mIGFuIGV4aXN0aW5nIC5wcm9wZXJ0aWVzIGZpbGUsIHJldHVybgotCSAqIHRoZSBMaW5lTnVtYmVyUmVhZGVyIHRoYXQgd2lsbCByZWFkIHRoZSBmaWxlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbG9hZExpbmVOdW1iZXJSZWFkZXIoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUZpbGUgcHJvcGVydHlGaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlpZiAoIXByb3BlcnR5RmlsZS5leGlzdHMoKSB8fCAhcHJvcGVydHlGaWxlLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUZpbGVSZWFkZXIgaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgRmlsZVJlYWRlcihwcm9wZXJ0eUZpbGUpOwotCQl9Ci0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBCZWNhdXNlIHdlIHdhbnQgdG8gcmVhZCBpbiBhIGxpbmUgYXQgYSB0aW1lIGZyb20gdGhlIGZpbGUsIGNvbnZlcnQgdGhlIEZpbGVSZWFkZXIgdG8gYSBMaW5lUmVhZGVyCi0JCUxpbmVOdW1iZXJSZWFkZXIgbGluZUlucHV0ID0gbmV3IExpbmVOdW1iZXJSZWFkZXIoaW5wdXQpOwotCQlyZXR1cm4gbGluZUlucHV0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbG9hZCBhbnl0aGluZzsgaXQgcmVsZWFzZXMgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQKLQkgKiBieSB0aGUgbG9hZExpbmVOdW1iZXJSZWFkZXIgbWV0aG9kLiBJdHMgcmVzdWx0IHdpbGwgbmV2ZXIgYmUgdXNlZCwgc28gYWx3YXlzCi0JICogcmV0dXJuIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZWxlYXNlTGluZU51bWJlclJlYWRlcihMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcikgewotCQlpZiAocmVhZGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJlYWRlci5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSB2YWxpZGF0b3IgaXMgdG9sZCB0byBwZXJmb3JtIGEgZnVsbCB2YWxpZGF0aW9uLCB0aGlzCi0JICogbWV0aG9kIHJldHVybnMgYW4gSUZpbGVEZWx0YVtdLCB3aXRoIG9uZSBJRmlsZURlbHRhIGZvciBldmVyeQotCSAqIC5wcm9wZXJ0aWVzIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBpdHMgc3ViZGlyZWN0b3JpZXMuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBsb2FkQWxsUHJvcGVydGllc0ZpbGVzKCkgewotCQlTdHJpbmcgcHdkID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgcHdkRGlyID0gbmV3IEZpbGUocHdkKTsKLQkJaWYgKCFwd2REaXIuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKCFwd2REaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTZXQgdGVtcFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXRyYXZlcnNlRGlyZWN0b3JpZXMocHdkRGlyLCB0ZW1wU2V0KTsKLQkJCi0JCUlGaWxlRGVsdGFbXSByZXN1bHQgPSBuZXcgSUZpbGVEZWx0YVt0ZW1wU2V0LnNpemUoKV07Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGVtcFNldC5pdGVyYXRvcigpOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUZpbGUgZmlsZSA9IChGaWxlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCXJlc3VsdFtjb3VudCsrXSA9IG5ldyBGaWxlRGVsdGEoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgSUZpbGVEZWx0YS5DSEFOR0VEKTsKLQkJfQotCQl0ZW1wU2V0LmNsZWFyKCk7Ci0JCXRlbXBTZXQgPSBudWxsOwotCQlpdGVyYXRvciA9IG51bGw7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVHJhdmVyc2UgdGhlIGRpcmVjdG9yeSwgbG9va2luZyBmb3IgLnByb3BlcnRpZXMgZmlsZXMsIGFuZCBpZiBhCi0JICogLnByb3BlcnRpZXMgZmlsZSBpcyBmb3VuZCB0aGVuIGFkZCBpdCB0byB0aGUgU2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYXZlcnNlRGlyZWN0b3JpZXMoRmlsZSBkaXJlY3RvcnlUb1NlYXJjaCwgU2V0IHJlc3VsdCkgewotCQlpZiAoZGlyZWN0b3J5VG9TZWFyY2ggPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGRpcmVjdG9yeVRvU2VhcmNoLmlzRGlyZWN0b3J5KCkpIHsKLQkJCS8vIFRyYXZlcnNlIGludG8gdGhpcyBkaXJlY3RvcnkncyBjaGlsZHJlbi4KLQkJCVN0cmluZ1tdIGNoaWxkcmVuID0gZGlyZWN0b3J5VG9TZWFyY2gubGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgY2hpbGQgPSBuZXcgRmlsZShkaXJlY3RvcnlUb1NlYXJjaCwgY2hpbGRyZW5baV0pOwotCQkJCXRyYXZlcnNlRGlyZWN0b3JpZXMoY2hpbGQsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihkaXJlY3RvcnlUb1NlYXJjaC5pc0ZpbGUoKSkgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gZGlyZWN0b3J5VG9TZWFyY2guZ2V0TmFtZSgpOwotCQkJaWYoKGZpbGVOYW1lICE9IG51bGwpICYmIGZpbGVOYW1lLmVuZHNXaXRoKCJwcm9wZXJ0aWVzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hZGQoZGlyZWN0b3J5VG9TZWFyY2gpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGFuIElNZXNzYWdlLCByZXR1cm4gdGhlIGZpbGUgbmFtZSBvZiB0aGUgLnByb3BlcnRpZXMgZmlsZSB0aGF0Ci0JICogdGhlIG1lc3NhZ2Ugd2FzIHJlcG9ydGVkIGFnYWluc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCU9iamVjdCBvYmplY3QgPSBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpOwotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlvYmplY3Q7Ci0JCQlBUHJvcGVydHlGaWxlIHBGaWxlID0gbGluZS5nZXRGaWxlKCk7Ci0JCQlyZXR1cm4gcEZpbGUuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsgLy8gYSBWYWxpZGF0aW9uUHJvcGVydHlGaWxlIHJldHVybnMgdGhlIGZpbGUgbmFtZSBhcyBpdHMgcXVhbGlmaWVkIG5hbWUKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEFQcm9wZXJ0eUZpbGUpIHsKLQkJCUFQcm9wZXJ0eUZpbGUgcEZpbGUgPSAoQVByb3BlcnR5RmlsZSlvYmplY3Q7Ci0JCQlyZXR1cm4gcEZpbGUuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsgLy8gYSBWYWxpZGF0aW9uUHJvcGVydHlGaWxlIHJldHVybnMgdGhlIGZpbGUgbmFtZSBhcyBpdHMgcXVhbGlmaWVkIG5hbWUKLQkJfQotCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VVJJcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbFdCL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS93b3JrYmVuY2hpbXBsL1BsdWdpblByb3BlcnR5RmlsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9QbHVnaW5Qcm9wZXJ0eUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkYzcwNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbFdCL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS93b3JrYmVuY2hpbXBsL1BsdWdpblByb3BlcnR5RmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qCi0gKiAoYykgQ29weXJpZ2h0IDIwMDEgTXlDb3Jwb3JhdGlvbi4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLndvcmtiZW5jaGltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuQVByb3BlcnR5RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLk1lc3NhZ2VNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIEEgUGx1Z2luUHJvcGVydHlGaWxlIHJlcHJlc2VudHMgYSByZXNvdXJjZSBidW5kbGUgdGhhdCBpcyBleHBvcnRlZCBieSBhIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblByb3BlcnR5RmlsZSBleHRlbmRzIEFQcm9wZXJ0eUZpbGUgewotCXByaXZhdGUgU3RyaW5nIF9idW5kbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcGx1Z2luSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9sYW5nVmFyaWFudCA9IG51bGw7IC8vIGUuZy4sIGVuX1VTIHZzIGVuCi0JcHJpdmF0ZSBDbGFzc0xvYWRlciBfY2xhc3NMb2FkZXIgPSBudWxsOyAvLyB0aGUgQ2xhc3NMb2FkZXIgdXNlZCB0byBsb2FkIHRoZSBidW5kbGUKLQkKLQkKLQkvKioKLQkgKiBCb3RoIHRoZSBwbHVnaW5JZCBhbmQgdGhlIGJ1bmRsZU5hbWUgbXVzdCBub3QgYmUgbnVsbCwgbXVzdAotCSAqIHJlZmVyIHRvIGFuIGV4aXN0aW5nIHBsdWdpbiwgYW5kIG11c3QgcmVmZXIgdG8gYW4gZXhpc3RpbmcgYnVuZGxlIAotCSAqIGV4cG9ydGVkIGJ5IHRoYXQgcGx1Z2luLgotCSAqLwotCXB1YmxpYyBQbHVnaW5Qcm9wZXJ0eUZpbGUoU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgYnVuZGxlTmFtZSkgewotCQlfcGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJX2J1bmRsZU5hbWUgPSBidW5kbGVOYW1lOwotCQkKLQkJQ2xhc3NMb2FkZXIgY2wgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpblMgPSBudWxsOwotCQlQbHVnaW4gcGx1Z2luID0gZ2V0UGx1Z2luKHBsdWdpbklkKTsJCQkKLQkJaWYoYnVuZGxlTmFtZS5lcXVhbHMoInBsdWdpbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFRyeSBsb2FkaW5nIGl0IGZyb20gdGhlIFBsdWdpbiBwYXJlbnQgKGEgInBsdWdpbi5wcm9wZXJ0aWVzIikKLQkJCWNsID0gZ2V0UGx1Z2luUHJvcGVydGllc0NsYXNzTG9hZGVyKHBsdWdpbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljbCA9IHBsdWdpbi5nZXREZXNjcmlwdG9yKCkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKTsKLQkJfQotCQlpblMgPSBnZXRJbnB1dFN0cmVhbShjbCwgYnVuZGxlTmFtZSk7Ci0JCQotCQlJbnB1dFN0cmVhbVJlYWRlciBpblIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5TKTsKLQkJTGluZU51bWJlclJlYWRlciBsaW5lUiA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKGluUik7Ci0JCXBhcnNlRmlsZShsaW5lUik7IC8vIHBvcHVsYXRlIHRoaXMgcHJvcGVydHkgZmlsZQotCQl0cnkgewotCQkJbGluZVIuY2xvc2UoKTsKLQkJCWluUi5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoKElPRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7OwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCQotCQl0cnkgewotCQkJaWYoaW5TICE9IG51bGwpIHsKLQkJCQlpblMuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQljYXRjaChJT0V4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCQotCQlfY2xhc3NMb2FkZXIgPSBjbDsgLy8gc3RvcmUgdGhlIENsYXNzTG9hZGVyIHdoaWNoIHdhcyB1c2VkIHRvIGxvYWQgdGhlIGJ1bmRsZQotCX0KLQkKLQlwcml2YXRlIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKENsYXNzTG9hZGVyIGNsLCBTdHJpbmcgYnVuZGxlTmFtZSkgewotCQlMb2NhbGUgbCA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCVN0cmluZyBsYW5ndWFnZSA9IGwuZ2V0TGFuZ3VhZ2UoKTsKLQkJU3RyaW5nIGNvdW50cnkgPSBsLmdldENvdW50cnkoKTsKLQkJU3RyaW5nIHZhcmlhbnQgPSBsLmdldFZhcmlhbnQoKTsKLQkJCi0JCVN0cmluZyBsYW5nID0gbnVsbDsKLQkJU3RyaW5nIGxhbmdfY291bnRyeSA9IG51bGw7Ci0JCVN0cmluZyBsYW5nX2NvdW50cnlfdmFyaWFudCA9IG51bGw7Ci0JCWlmKChsYW5ndWFnZSAhPSBudWxsKSAmJiAhKGxhbmd1YWdlLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWxhbmcgPSAiXyIgKyBsYW5ndWFnZTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYoKGNvdW50cnkgIT0gbnVsbCkgJiYgIShjb3VudHJ5LmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWxhbmdfY291bnRyeSA9IGxhbmcgKyAiXyIgKyBjb3VudHJ5OyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZigodmFyaWFudCAhPSBudWxsKSAmJiAhKHZhcmlhbnQuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJbGFuZ19jb3VudHJ5X3ZhcmlhbnQgPSBsYW5nX2NvdW50cnkgKyAiXyIgKyB2YXJpYW50OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCUlucHV0U3RyZWFtIGluUyA9IG51bGw7Ci0JCWlmKGxhbmdfY291bnRyeV92YXJpYW50ICE9IG51bGwpIHsKLQkJCWluUyA9IGdldFJlc291cmNlQXNTdHJlYW0oY2wsIGJ1bmRsZU5hbWUsIGxhbmdfY291bnRyeV92YXJpYW50KTsKLQkJCWlmKGluUyAhPSBudWxsKSB7Ci0JCQkJX2xhbmdWYXJpYW50ID0gbGFuZ19jb3VudHJ5X3ZhcmlhbnQ7Ci0JCQkJcmV0dXJuIGluUzsKLQkJCX0KLQkJfQotCQkKLQkJaWYobGFuZ19jb3VudHJ5ICE9IG51bGwpIHsKLQkJCWluUyA9IGdldFJlc291cmNlQXNTdHJlYW0oY2wsIGJ1bmRsZU5hbWUsIGxhbmdfY291bnRyeSk7Ci0JCQlpZihpblMgIT0gbnVsbCkgewotCQkJCV9sYW5nVmFyaWFudCA9IGxhbmdfY291bnRyeTsKLQkJCQlyZXR1cm4gaW5TOwotCQkJfQotCQl9Ci0JCQotCQlpZihsYW5nICE9IG51bGwpIHsKLQkJCWluUyA9IGdldFJlc291cmNlQXNTdHJlYW0oY2wsIGJ1bmRsZU5hbWUsIGxhbmcpOwotCQkJaWYoaW5TICE9IG51bGwpIHsKLQkJCQlfbGFuZ1ZhcmlhbnQgPSBsYW5nOwotCQkJCXJldHVybiBpblM7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKExvY2FsZS5nZXREZWZhdWx0KCkuZXF1YWxzKExvY2FsZS5VUykpIHsKLQkJCS8vIFJ1bm5pbmcgdGhlIFRWVCBwbHVnaW4gaW4gZW5fVVMgbW9kZSwgc28gcmV0dXJuIHRoZSBkZWZhdWx0IC5wcm9wZXJ0aWVzIGZpbGUuCi0JCQlpblMgPSBnZXRSZXNvdXJjZUFzU3RyZWFtKGNsLCBidW5kbGVOYW1lLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGluUyAhPSBudWxsKSB7Ci0JCQkJX2xhbmdWYXJpYW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gaW5TOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShmaW5hbCBDbGFzc0xvYWRlciBjbCwgZmluYWwgU3RyaW5nIGJ1bmRsZU5hbWUsIGZpbmFsIFN0cmluZyBsYW5ndWFnZSkgewotCQlTdHJpbmcgcmVzTmFtZSA9IGJ1bmRsZU5hbWUucmVwbGFjZSgnLicsICcvJykgKyBsYW5ndWFnZSArICIucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNsLmdldFJlc291cmNlQXNTdHJlYW0ocmVzTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldFBsdWdpblByb3BlcnRpZXNDbGFzc0xvYWRlcihQbHVnaW4gcCkgewotCQkvLyBDb3BpZWQgZnJvbSBQbHVnaW5EZXNjcmlwdG9yLmphdmEncyBnZXRSZXNvdXJjZUJ1bmRsZSBtZXRob2QuCi0JCVVSTFtdIGNwID0gKChVUkxDbGFzc0xvYWRlcilwLmdldERlc2NyaXB0b3IoKS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpKS5nZXRVUkxzKCk7Ci0JCVVSTFtdIG5ld2NwID0gbmV3IFVSTFtjcC5sZW5ndGgrMV07Ci0JCWZvciAoaW50IGk9MDsgaTxjcC5sZW5ndGg7IGkrKykgbmV3Y3BbaSsxXSA9IGNwW2ldOwotCQl0cnkgewotCQkJbmV3Y3BbMF0gPSBQbGF0Zm9ybS5yZXNvbHZlKHAuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSk7IC8vJE5PTi1OTFMtMSQgLy8gYWx3YXlzIHRyeSB0byByZXNvbHZlIFVSTHMgdXNlZCBpbiBsb2FkZXJzCi0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJbmV3Y3BbMF0gPSBwLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDbGFzc0xvYWRlciByZXNvdXJjZUxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXdjcCwgbnVsbCk7Ci0JCXJldHVybiByZXNvdXJjZUxvYWRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUGx1Z2luIGdldFBsdWdpbihTdHJpbmcgcGx1Z2luSWQpIHsKLQkJaWYgKHBsdWdpbklkID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzYyA9IHJlZ2lzdHJ5LmdldFBsdWdpbkRlc2NyaXB0b3IocGx1Z2luSWQpOwotCQlpZihwbHVnaW5EZXNjID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQl0cnkgewotCQkJcmV0dXJuIHBsdWdpbkRlc2MuZ2V0UGx1Z2luKCk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOzsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCX0KLQotCQotCS8qCi0JICogQHNlZSBBUHJvcGVydHlGaWxlI3JlcG9ydChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3J0KFN0cmluZyBzdHIpIHsKLQkJYWRkUGFyc2VXYXJuaW5nKG5ldyBNZXNzYWdlTWV0YURhdGEoc3RyKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcG9ydChJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKG1lc3NhZ2UuZ2V0QnVuZGxlTmFtZSgpLCBtZXNzYWdlLmdldFNldmVyaXR5KCksIG1lc3NhZ2UuZ2V0SWQoKSwgbWVzc2FnZS5nZXRQYXJhbXMoKSwgbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKSwgbWVzc2FnZS5nZXRMaW5lTnVtYmVyKCksIG1lc3NhZ2UuZ2V0T2Zmc2V0KCksIG1lc3NhZ2UuZ2V0TGVuZ3RoKCkpOwotCQlhZGRQYXJzZVdhcm5pbmcobW1kKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVwb3J0KE1lc3NhZ2VNZXRhRGF0YSBtbWQpIHsKLQkJYWRkUGFyc2VXYXJuaW5nKG1tZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhcnNlV2FybmluZyhJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKG1lc3NhZ2UuZ2V0QnVuZGxlTmFtZSgpLCBtZXNzYWdlLmdldFNldmVyaXR5KCksIG1lc3NhZ2UuZ2V0SWQoKSwgbWVzc2FnZS5nZXRQYXJhbXMoKSwgbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKSwgbWVzc2FnZS5nZXRMaW5lTnVtYmVyKCksIG1lc3NhZ2UuZ2V0T2Zmc2V0KCksIG1lc3NhZ2UuZ2V0TGVuZ3RoKCkpOwotCQlhZGRQYXJzZVdhcm5pbmcobW1kKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIF9wbHVnaW5JZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiBfYnVuZGxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRGaWxlTmFtZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0UGx1Z2luSWQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIjo6Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRCdW5kbGVOYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKF9sYW5nVmFyaWFudCk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhbmdWYXJpYW50KCkgewotCQlyZXR1cm4gX2xhbmdWYXJpYW50OwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBfY2xhc3NMb2FkZXI7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsV0Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3dvcmtiZW5jaGltcGwvUHJvcGVydGllc0hlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZmE4YWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUud29ya2JlbmNoaW1wbDsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5QTW9kZWxFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuQVByb3BlcnR5RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLlByb3BlcnR5TGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoRmlsZURlbHRhOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgV2ViU3BoZXJlIFN0dWRpbyBJVmFsaWRhdGlvbkNvbnRleHQgZm9yIHRoZSAKLSAqIFByb3BlcnRpZXMgVmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydGllc0hlbHBlciBleHRlbmRzIFdvcmtiZW5jaENvbnRleHQgewotCXB1YmxpYyBQcm9wZXJ0aWVzSGVscGVyKCkgewotCQlzdXBlcigpOwotCQkgCi0JCXJlZ2lzdGVyTW9kZWwoUE1vZGVsRW51bS5MSU5FSU5QVVRSRUFERVIsICJsb2FkTGluZU51bWJlclJlYWRlciIsIG5ldyBDbGFzc1tde2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3Rlck1vZGVsKFBNb2RlbEVudW0uUkVMRUFTRV9MSU5FSU5QVVRSRUFERVIsICJyZWxlYXNlTGluZU51bWJlclJlYWRlciIsIG5ldyBDbGFzc1tde2phdmEuaW8uTGluZU51bWJlclJlYWRlci5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCXJlZ2lzdGVyTW9kZWwoUE1vZGVsRW51bS5BTExfUFJPUEVSVElFU19GSUxFUywgImxvYWRBbGxQcm9wZXJ0aWVzRmlsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3Rlck1vZGVsKFBNb2RlbEVudW0uTVNHTE9HR0VSLCAiZ2V0TXNnTG9nZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJNb2RlbChQTW9kZWxFbnVtLkZJTFRFUiwgImZpbHRlciIsIG5ldyBDbGFzc1tde0lGaWxlRGVsdGFbXS5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5JV29ya2JlbmNoQ29udGV4dCNnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE9iamVjdE5hbWUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5JV29ya2JlbmNoQ29udGV4dCNnZXRSZXNvdXJjZShPYmplY3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlvYmplY3Q7Ci0JCQlBUHJvcGVydHlGaWxlIHBGaWxlID0gbGluZS5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBwRmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpOyAvLyBhIFZhbGlkYXRpb25Qcm9wZXJ0eUZpbGUgcmV0dXJucyB0aGUgZmlsZSBuYW1lIGFzIGl0cyBxdWFsaWZpZWQgbmFtZQotCQkJZmlsZSA9IGdldEZpbGUoZmlsZU5hbWUpOwotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgQVByb3BlcnR5RmlsZSkgewotCQkJQVByb3BlcnR5RmlsZSBwRmlsZSA9IChBUHJvcGVydHlGaWxlKW9iamVjdDsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IHBGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCk7IC8vIGEgVmFsaWRhdGlvblByb3BlcnR5RmlsZSByZXR1cm5zIHRoZSBmaWxlIG5hbWUgYXMgaXRzIHF1YWxpZmllZCBuYW1lCi0JCQlmaWxlID0gZ2V0RmlsZShmaWxlTmFtZSk7Ci0JCX0KLQkJCi0JCWlmKChmaWxlID09IG51bGwpIHx8ICghZmlsZS5leGlzdHMoKSkpIHsKLQkJCXJldHVybiBzdXBlci5nZXRSZXNvdXJjZShvYmplY3QpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQkvKioKLQkgKiBXaGVuIGEgZnVsbCB2YWxpZGF0aW9uIGlzIHBlcmZvcm1lZCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbgotCSAqIElGaWxlRGVsdGFbXSBjb250YWluaW5nIG9uZSBJRmlsZURlbHRhIGZvciBlYWNoIC5wcm9wZXJ0aWVzIAotCSAqIGZpbGUgaW4gdGhlIElQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJRmlsZURlbHRhW10gbG9hZEFsbFByb3BlcnRpZXNGaWxlcygpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCi0JCWZpbmFsIFNldCBmaWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWlmKCFyZXMuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBpZiB0aGUgcmVzb3VyY2UgaXNuJ3QgYWNjZXNzaWJsZSB0aGVuIG5laXRoZXIgYXJlIGl0cyBjaGlsZHJlbgotCQkJCX0KLQkJCQkKLQkJCQlpZihpc1NyY0ZpbGUocmVzKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVdvcmtiZW5jaEZpbGVEZWx0YSBuZXdGaWxlRGVsdGEgPSBuZXcgV29ya2JlbmNoRmlsZURlbHRhKHJlcy5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIElGaWxlRGVsdGEuQ0hBTkdFRCwgcmVzKTsKLQkJCQkJZmlsZXMuYWRkKG5ld0ZpbGVEZWx0YSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7IC8vIHZpc2l0IHRoZSByZXNvdXJjZSdzIGNoaWxkcmVuIGFzIHdlbGwKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlIHBoYW50b20gcmVzb3VyY2VzCi0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShlKTsKLQkJCX0KLQkJfQotCQkKLQkJSUZpbGVEZWx0YVtdIHJlc3VsdCA9IG5ldyBJRmlsZURlbHRhW2ZpbGVzLnNpemUoKV07Ci0JCWZpbGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRmlsZSBoYW5kbGUgZm9yIHRoZSBmaWxlIGlkZW50aWZpZWQgYnkgZmlsZU5hbWUuCi0JICogbnVsbCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlTmFtZSkgewotCQlJRmlsZSBmaWxlID0gKElGaWxlKVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihmaWxlTmFtZSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiB0aGUgZmlsZSBuYW1lIG9mIGFuIGV4aXN0aW5nIC5wcm9wZXJ0aWVzIGZpbGUsIHJldHVybgotCSAqIHRoZSBMaW5lTnVtYmVyUmVhZGVyIHRoYXQgd2lsbCByZWFkIHRoZSBmaWxlLgotCSAqLwotCXB1YmxpYyBMaW5lTnVtYmVyUmVhZGVyIGxvYWRMaW5lTnVtYmVyUmVhZGVyKFN0cmluZyBmaWxlTmFtZSkgewotCQl0cnkgewotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoZmlsZU5hbWUpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pOwotCQotCQkJLy8gQmVjYXVzZSB3ZSB3YW50IHRvIHJlYWQgaW4gYSBsaW5lIGF0IGEgdGltZSBmcm9tIHRoZSBmaWxlLCBjb252ZXJ0IHRoZSBJbnB1dFN0cmVhbVJlYWRlciB0byBhIExpbmVSZWFkZXIKLQkJCUxpbmVOdW1iZXJSZWFkZXIgbGluZUlucHV0ID0gbmV3IExpbmVOdW1iZXJSZWFkZXIocmVhZGVyKTsKLQkJCXJldHVybiBsaW5lSW5wdXQ7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKGV4Yyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGxvYWQgYW55dGhpbmc7IGl0IHJlbGVhc2VzIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkCi0JICogYnkgdGhlIGxvYWRMaW5lTnVtYmVyUmVhZGVyIG1ldGhvZC4gSXRzIHJlc3VsdCB3aWxsIG5ldmVyIGJlIHVzZWQsIHNvIGFsd2F5cwotCSAqIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBMaW5lTnVtYmVyUmVhZGVyIHJlbGVhc2VMaW5lTnVtYmVyUmVhZGVyKExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyKSB7Ci0JCWlmKHJlYWRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXJlYWRlci5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKGV4Yyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIE1zZ0xvZ2dlciBmcm9tIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGxvZyBleGNlcHRpb25zLgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbmV2ZXIgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCXJldHVybiBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCX0KLQkKLQkvLyBwYWNrYWdlIHZpc2liaWxpdHkgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QpCi0JYm9vbGVhbiBpc1NyY0ZpbGUoSVJlc291cmNlIHJlcykgewotCQkvLyBXYW50IHRvIGZpbHRlciBvdXQgdGhlIGNvcGllcyBpbiB0aGUgImJpbiIgZGlyZWN0b3J5LgotCQlpZihyZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighKHJlcyBpbnN0YW5jZW9mIElGaWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighInByb3BlcnRpZXMiLmVxdWFscyhyZXMuZ2V0RmlsZUV4dGVuc2lvbigpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7IAkJCi0JCX0KLQkJCi0JCWlmKHJlcy5pc0Rlcml2ZWQoKSkgewotCQkJLy8gQ3JlYXRlZCBieSBlY2xpcHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgSUZpbGVEZWx0YVtdIGZpbHRlcihJRmlsZURlbHRhW10gY2hhbmdlZEZpbGVzKSB7Ci0JCUlGaWxlRGVsdGFbXSB0ZW1wID0gbmV3IElGaWxlRGVsdGFbY2hhbmdlZEZpbGVzLmxlbmd0aF07Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvcihpbnQgaT0wOyBpPGNoYW5nZWRGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJSUZpbGVEZWx0YSBmZCA9IGNoYW5nZWRGaWxlc1tpXTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9ICgoV29ya2JlbmNoRmlsZURlbHRhKWZkKS5nZXRSZXNvdXJjZSgpOwotCQkJaWYoaXNTcmNGaWxlKHJlc291cmNlKSkgewotCQkJCXRlbXBbY291bnQrK10gPSBmZDsKLQkJCX0KLQkJfQotCQkKLQkJaWYoY291bnQgPT0gY2hhbmdlZEZpbGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIGNoYW5nZWRGaWxlczsKLQkJfQotCQkKLQkJSUZpbGVEZWx0YVtdIHJlc3VsdCA9IG5ldyBJRmlsZURlbHRhW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsV0Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3dvcmtiZW5jaGltcGwvUHJvcGVydGllc1ZhbGlkYXRvclBsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzI2ZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS53b3JrYmVuY2hpbXBsOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiBVUwotICogR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAKLSAqIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0gKiAKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4gVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0gcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91Ci0gKiBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZyB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiBUaGUgY29kZSBpcwotICogcHJvdmlkZWQgIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFCi0gKiBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIENPREUuIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlIGZvcgotICogYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlCi0gKiBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgUGx1Z2luIGNsYXNzIGlkZW50aWZpZWQgYnkgdGhlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5wcm9wJ3MgcGx1Z2luLnhtbAotICogZmlsZSAoaS5lLiwgdGhlICZsdDtwbHVnaW4gPGJyPjxicj4KLSAqIGNsYXNzPSZxdW90O2NsYXNzPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUucHJvcGVydGllcy53b3JrYmVuY2hpbXBsLlByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4iJnF1b3QmZ3Q7Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luIGV4dGVuZHMgV1RQUGx1Z2luIHsKLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luIF9pbnN0ID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIExvZ2dlciBfbG9nZ2VyOwotCXB1YmxpYyBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoX2luc3QgPT0gbnVsbCkgewotCQkJX2luc3QgPSB0aGlzOwotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllc1ZhbGlkYXRvclBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCWlmIChfbG9nZ2VyID09IG51bGwpCi0JCQlfbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpOwotCQlyZXR1cm4gX2xvZ2dlcjsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnd0cC5jb21tb24uV1RQUGx1Z2luI2dldFBsdWdpbklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9QTW9kZWxFbnVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvUE1vZGVsRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjE2ZWVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9QTW9kZWxFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyB0aGUgY29uc3RhbnRzIHRoYXQgdW5pcXVlbHkgaWRlbnRpZnkgZWFjaAotICogbW9kZWwgdGhhdCB0aGUgUHJvcGVydGllcyBWYWxpZGF0b3IncyBoZWxwZXIgbXVzdCBsb2FkLiBBbGwgb2YKLSAqIHRoZXNlIG1vZGVscyBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGUgSVZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudGF0aW9uCi0gKiBvciB0aGUgaGVscGVyIGNhbm5vdCBiZSB1c2VkIHRvIHN1cHBvcnQgdGhlIFByb3BlcnRpZXMgVmFsaWRhdG9yLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBNb2RlbEVudW0gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVJTlBVVFJFQURFUiA9ICJnZXQgYSBMaW5lSW5wdXRSZWFkZXIgZm9yIGEgLnByb3BlcnRpZXMgZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxFQVNFX0xJTkVJTlBVVFJFQURFUiA9ICJyZWxhc2UgKGNsb3NlKSB0aGUgTGluZUlucHV0UmVhZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9QUk9QRVJUSUVTX0ZJTEVTID0gInJldHVybiBhbiBJRmlsZURlbHRhW10gb2YgYWxsIG9mIHRoZSAucHJvcGVydGllcyBmaWxlcyBpbiB0aGUgcHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dMT0dHRVIgPSAiZ2V0IHRoZSBNc2dMb2dnZXIgbmVlZGVkIHRvIGxvZyBtZXNzYWdlcy4gVGhpcyBNc2dMb2dnZXIgbXVzdCBuZXZlciBiZSBudWxsLiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVIgPSAiZ2V0IG9ubHkgdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIHRoYXQgYXJlIGluIHNyYyBkaXI7IGZpbHRlciBvdXQgdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIHRoYXQgYXJlIGluIGJpbiBkaXIgKGkuZS4sIGRvbid0IHZhbGlkYXRlIHRoZSBzYW1lIGZpbGUgdHdpY2UiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9Qcm9wZXJ0aWVzVmFsaWRhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvUHJvcGVydGllc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWJmYjI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9Qcm9wZXJ0aWVzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGU7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLklWYWxpZGF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIHRoYXQgdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIGhhcyBubyBzeW50YXggb3IKLSAqIG9yIHByb2JsZW1zLiBUaGlzIHZhbGlkYXRvciBjYW4gcnVuIGluIGFueSB2YWxpZGF0aW9uIGZyYW1ld29yawotICogaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRvciNjbGVhbnVwKElSZXBvcnRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBUaGlzIHZhbGlkYXRvciBkb2Vzbid0IGNhY2hlIGFueXRoaW5nIHNvIGl0IGRvZXNuJ3QgbmVlZCB0byBjbGVhbiBhbnl0aGluZyB1cC4KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRvciN2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQsIElSZXBvcnRlciwgSUZpbGVEZWx0YVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlJRmlsZURlbHRhW10gZmlsZVVSSXMgPSBudWxsOwotCQlpZigoZmlsZVVSSXMgPT0gbnVsbCkgfHwgKGZpbGVVUklzLmxlbmd0aCA9PSAwKSkgewotCQkJZmlsZVVSSXMgPSAoSUZpbGVEZWx0YVtdKWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5BTExfUFJPUEVSVElFU19GSUxFUyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBGaWx0ZXIgb3V0IHRoZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgImJpbiIgZGlyZWN0b3J5LgotCQkJZmlsZVVSSXMgPSAoSUZpbGVEZWx0YVtdKWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5GSUxURVIsIG5ldyBPYmplY3RbXXtoZWxwZXIuZ2V0VVJJcygpfSk7Ci0JCX0KLQkJaWYoZmlsZVVSSXMgPT0gbnVsbCkgewotCQkJLy8gUHJvYmxlbSBsb2FkaW5nIHRoZSBmaWxlcy4gCi0JCQlMb2dnZXIgbG9nZ2VyID0gKExvZ2dlciloZWxwZXIubG9hZE1vZGVsKFBNb2RlbEVudW0uTVNHTE9HR0VSKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwiY2hhbmdlZEZpbGVzID09IG51bGw7IHRlcm1pbmF0aW5nIHZhbGlkYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBMb2FkIHRoZSByZWFkZXIgZm9yIHRoZSBmaWxlCi0JCQlMaW5lTnVtYmVyUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlYWRlciA9IChMaW5lTnVtYmVyUmVhZGVyKWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5MSU5FSU5QVVRSRUFERVIsIG5ldyBPYmplY3RbXXt1cmlzW2ldfSk7Ci0JCQkJaWYocmVhZGVyID09IG51bGwpIHsKLQkJCQkJLy8gRWl0aGVyOiAKLQkJCQkJLy8gMS4gVGhlIGZpbGUgZG9lc24ndCBleGlzdCBvcgotCQkJCQkvLyAyLiBUaGUgZmlsZSBpc24ndCBhIC5wcm9wZXJ0aWVzIGZpbGUgb3IKLQkJCQkJLy8gMy4gVGhlIGZpbGUgY2FuJ3QgYmUgcmVhZAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA5MCwgbmV3IFN0cmluZ1tde3VyaXNbaV19KTsKLQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQotCQkJCS8vIElmIHdlIGNhbiBnZXQgYSByZWFkZXIgdGhlbiB3ZSBjYW4gZ2V0IGEgUHJvcGVydHlGaWxlCi0JCQkJVmFsaWRhdG9yUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFZhbGlkYXRvclByb3BlcnR5RmlsZShyZWFkZXIsIHVyaXNbaV0sIHJlcG9ydGVyLCB0aGlzKTsKLQkJCQlwcm9wRmlsZS5wcmludFN5bnRheFdhcm5pbmdzKCk7Ci0JCQkJcHJvcEZpbGUucHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoKTsKLQkJCQlwcm9wRmlsZS5wcmludER1cGxpY2F0ZU1lc3NhZ2VQcmVmaXgoKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIERvbid0IGNhdGNoIFRocm93YWJsZSwgTWVzc2FnZUxpbWl0RXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiwgb3IgVmFsaWRhdGlvbkV4Y2VwdGlvbi4KLQkJCQkvLyBMZXQgdGhlbSB0cmF2ZWwgdXAgdG8gdGhlIGZyYW1ld29yayBhbmQgdGhlIGZyYW1ld29yayB3aWxsIGxvZyBvciBjbGVhbnVwIGFzIGFwcHJvcHJpYXRlLgotCQkJCWlmKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJCS8vIFJlbGVhc2UgdGhlIHJlYWRlciBmb3IgdGhlIGZpbGUuCi0JCQkJCS8vIEJlY2F1c2UgZGlmZmVyZW50IHZhbGlkYXRpb24gZnJhbWV3b3JrcyBtYXkgYWxsb2NhdGUgTGluZU51bWJlclJlYWRlcnMKLQkJCQkJLy8gZGlmZmVyZW50bHksIGRvbid0IGNsb3NlIHRoZSByZWFkZXIgaW4gdGhlIHZhbGlkYXRvci4gSW5zdGVhZCwgcGFzcyB0aGUKLQkJCQkJLy8gcmVhZGVyIGJhY2sgdG8gdGhlIGhlbHBlciwgYW5kIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcmVhZGVyIHNob3VsZCAKLQkJCQkJLy8gYmUgY2xvc2VkIG9yIHJldXNlZCwgdGhlIGhlbHBlciBrbm93cyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gZm9yIGl0cwotCQkJCQkvLyBmcmFtZXdvcmsgZW52aXJvbm1lbnQuCi0JCQkJCWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5SRUxFQVNFX0xJTkVJTlBVVFJFQURFUiwgbmV3IE9iamVjdFtde3JlYWRlcn0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9WYWxpZGF0b3JQcm9wZXJ0eUZpbGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9WYWxpZGF0b3JQcm9wZXJ0eUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFkZDM2ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvVmFsaWRhdG9yUHJvcGVydHlGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGU7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5BUHJvcGVydHlGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuTWVzc2FnZU1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gQVByb3BlcnR5RmlsZSB0aGF0IGlzIGluc3RhbnRpYXRlZCBieSBhIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclByb3BlcnR5RmlsZSBleHRlbmRzIEFQcm9wZXJ0eUZpbGUgewotCXByaXZhdGUgSVJlcG9ydGVyIF9yZXBvcnRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJVmFsaWRhdG9yIF92YWxpZGF0b3IgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9maWxlTmFtZSA9IG51bGw7IC8vIGlmIHRoaXMgaXMgY3JlYXRlZCBmcm9tIGEgcmVhZGVyIGluc3RlYWQgb2YgYSBmaWxlIG5hbWUsIHdlIG9ubHkgaGF2ZSB0aGUgYnVuZGxlIG5hbWUKLQkKLQlwdWJsaWMgVmFsaWRhdG9yUHJvcGVydHlGaWxlKExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZmlsZU5hbWUsIElSZXBvcnRlciByZXBvcnRlciwgSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCQlfcmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJX3ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJcGFyc2VGaWxlKHJlYWRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBidW5kbGVOYW1lKSB7Ci0JCV9maWxlTmFtZSA9IGJ1bmRsZU5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgLnByb3BlcnRpZXMgZmlsZSAob3IgYnVuZGxlKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlyZXR1cm4gX2ZpbGVOYW1lOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgQVByb3BlcnR5RmlsZSNyZXBvcnQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydChTdHJpbmcgc3RyKSB7Ci0JCS8vIE5ldmVyIHByaW50IHRpdGxlcyBsaWtlICJEVVBMSUNBVEUgTUVTU0FHRSBJRFMiLiBQcmludCBvbmx5IHRoZSBJTWVzc2FnZS4KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEFQcm9wZXJ0eUZpbGUjcmVwb3J0KE1lc3NhZ2VNZXRhRGF0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoTWVzc2FnZU1ldGFEYXRhIG1tZCkgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoKTsKLQkJbWVzc2FnZS5zZXRCdW5kbGVOYW1lKG1tZC5nZXRCdW5kbGVOYW1lKCkpOwotCQltZXNzYWdlLnNldFNldmVyaXR5KGdldFNldmVyaXR5KG1tZC5nZXRTZXZlcml0eSgpKSk7Ci0JCW1lc3NhZ2Uuc2V0SWQobW1kLmdldElkKCkpOwotCQltZXNzYWdlLnNldFBhcmFtcyhtbWQuZ2V0UGFyYW1zKCkpOwotCQltZXNzYWdlLnNldFRhcmdldE9iamVjdChtbWQuZ2V0VGFyZ2V0T2JqZWN0KCkpOwotCQltZXNzYWdlLnNldExpbmVObyhtbWQuZ2V0TGluZU51bWJlcigpKTsKLQkJbWVzc2FnZS5zZXRMZW5ndGgobW1kLmdldExlbmd0aCgpKTsKLQkJbWVzc2FnZS5zZXRPZmZzZXQobW1kLmdldE9mZnNldCgpKTsKLQkJbWVzc2FnZS5zZXRMZW5ndGgobW1kLmdldExlbmd0aCgpKTsKLQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UoZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiB0aGUgc2V2ZXJpdHkgb2YgdGhlIE1lc3NhZ2VNZXRhRGF0YSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCi0JICogc2V2ZXJpdHkgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRTZXZlcml0eShpbnQgbW1kU2V2ZXJpdHkpIHsKLQkJc3dpdGNoKG1tZFNldmVyaXR5KSB7Ci0JCQljYXNlKE1lc3NhZ2VNZXRhRGF0YS5FUlJPUik6IHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCX0KLQkJCQotCQkJY2FzZShNZXNzYWdlTWV0YURhdGEuSU5GTyk6IHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQkJfQotCQkJCi0JCQlkZWZhdWx0OiB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIElWYWxpZGF0b3IgaW5zdGFuY2UgdGhhdCBpcyBjaGVja2luZyB0aGlzIGZpbGUuCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBmaWxlIHRoYXQgaWRlbnRpZmllcyB0aGlzIGZpbGUgdW5pcXVlbHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvQVByb3BlcnR5RmlsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9BUHJvcGVydHlGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYzhiOWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9BUHJvcGVydHlGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgLnByb3BlcnRpZXMgZmlsZTsgZXh0ZW5zaW9ucyBvZiB0aGlzIGNsYXNzIGltcGxlbWVudAotICogZW52aXJvbm1lbnQtc3BlY2lmaWMgbWVzc2FnZXMsIHN1Y2ggYXMgaG93IHRvIHJlcG9ydCB0aGUga25vd24gcHJvYmxlbXMuIFRoaXMKLSAqIGNsYXNzLCBhbmQgZXZlcnkgY2xhc3MgaW4gdGhlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIgcGFja2FnZSwgaXMgaW5kZXBlbmRlbnQKLSAqIG9mIHRoZSBmcmFtZXdvcmsgZW52aXJvbm1lbnQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBUHJvcGVydHlGaWxlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVQUxTID0gIj0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIExpc3QgX3Byb3BlcnR5TGluZXMgPSBudWxsOyAvLyBUaGUgTGlzdCBvZiBQcm9wZXJ0eUxpbmUgaW5zdGFuY2VzLgotCXByaXZhdGUgTGlzdCBfcGFyc2VXYXJuaW5ncyA9IG51bGw7IC8vIFRoZSBMaXN0IG9mIE1lc3NhZ2VNZXRhRGF0YSB3YXJuaW5ncyBmb3VuZCB3aGVuIHBhcnNpbmcgdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JcHJpdmF0ZSBib29sZWFuIF9kZWJ1ZyA9IGZhbHNlOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbmFtZSB0aGF0IGlkZW50aWZpZXMgdGhpcyBmaWxlIHVuaXF1ZWx5LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBUZWxsIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgYSBwcm9ibGVtIC0gaW4gV2ViU3BoZXJlIFN0dWRpbywgdGhpcwotCSAqIHNob3dzIHVwIGFzIGEgcm93IGluIHRoZSBUYXNrIFZpZXc7IGluIHRoZSBzYW1wbGUgZmlsZXN5c3RlbSBmcmFtZXdvcmssCi0JICogdGhpcyBhcHBlYXJzIGFzIGEgbWVzc2FnZSB0byBTeXN0ZW0ub3V0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcG9ydChTdHJpbmcgc3RyKTsKLQkKLQkvKioKLQkgKiBUZWxsIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgYSBwcm9ibGVtIC0gaW4gV2ViU3BoZXJlIFN0dWRpbywgdGhpcwotCSAqIHNob3dzIHVwIGFzIGEgcm93IGluIHRoZSBUYXNrIFZpZXc7IGluIHRoZSBzYW1wbGUgZmlsZXN5c3RlbSBmcmFtZXdvcmssCi0JICogdGhpcyBhcHBlYXJzIGFzIGEgbWVzc2FnZSB0byBTeXN0ZW0ub3V0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcG9ydChNZXNzYWdlTWV0YURhdGEgbW1kKTsKLQkKLQlwcm90ZWN0ZWQgQVByb3BlcnR5RmlsZSgpIHsKLQkJX3Byb3BlcnR5TGluZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCV9wYXJzZVdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgdGhlIExpc3Qgb2YgTWVzc2FnZU1ldGFEYXRhIHRvIHRoZSBsaXN0IG9mIHdhcm5pbmcgbWVzc2FnZXMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFyc2VXYXJuaW5ncyhMaXN0IGxpc3QpIHsKLQkJX3BhcnNlV2FybmluZ3MuYWRkQWxsKGxpc3QpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHNpbmdsZSB3YXJuaW5nIG1lc3NhZ2UgdG8gdGhlIGxpc3Qgb2YgcGFyc2Ugd2FybmluZ3MuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFyc2VXYXJuaW5nKE1lc3NhZ2VNZXRhRGF0YSBtbWQpIHsKLQkJX3BhcnNlV2FybmluZ3MuYWRkKG1tZCk7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIExpc3Qgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHJlcG9ydCBwcm9ibGVtcyBmb3VuZAotCSAqIHdoaWxlIHBhcnNpbmcgdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGFyc2VXYXJuaW5ncygpIHsKLQkJcmV0dXJuIF9wYXJzZVdhcm5pbmdzOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgZGVidWcgaW5mb3JtYXRpb24gYmUgcHJpbnRlZCB3aGVuIHBhcnNpbmc/Ci0JICovCQotCXB1YmxpYyBib29sZWFuIGRlYnVnKCkgewotCQlyZXR1cm4gX2RlYnVnOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGQpIHsKLQkJX2RlYnVnID0gZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmKG8gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighKG8gaW5zdGFuY2VvZiBQcm9wZXJ0eUZpbGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVByb3BlcnR5RmlsZSBmaWxlID0gKFByb3BlcnR5RmlsZSlvOwotCQlyZXR1cm4gZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKS5lcXVhbHMoZmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldFF1YWxpZmllZEZpbGVOYW1lKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBtZXNzYWdlcyBpbiB0aGUgZmlsZSwgaW5jbHVkaW5nIGR1cGxpY2F0ZXMgJiBibGFua3MuCi0JICovCi0JcHVibGljIGludCBnZXROdW1Qcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gX3Byb3BlcnR5TGluZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1ZGluZyBtZXNzYWdlIGlkcyBhbmQgZXJyb3IgaWRzLCBvdXRwdXQgdGhlIG51bWJlciBvZiB3b3JkcyBpbiB0aGUKLQkgKiAucHJvcGVydGllcyBmaWxlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtV29yZHMoKSB7Ci0JCS8vIE5PVCBhIGZhc3QgbWV0aG9kLi4uLmhvdyB0byBvcHRpbWl6ZT8KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWNvdW50ICs9IGxpbmUuZ2V0TnVtV29yZHMoKTsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgdW5pcXVlIG1lc3NhZ2UgcHJlZml4ZXMgaW4gdGhlIGZpbGUuCi0JICogKEEgbWVzc2FnZSBwcmVmaXggc3RhcnRzIHRoZSBtZXNzYWdlIHRleHQsIGUuZy4sIEFCQ0QwMDAwRS4pCi0JICovCi0JcHVibGljIGludCBnZXROdW1VbmlxdWVQcmVmaXhlcygpIHsKLQkJU2V0IHVuaXF1ZUlkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0UHJvcGVydHlMaW5lcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJdW5pcXVlSWRzLmFkZChsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVuaXF1ZUlkcy5zaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgbWVzc2FnZSBwcmVmaXhlcyB1c2VkIGluIHRoZSBmaWxlLgotCSAqIFVzdWFsbHkgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwcmVmaXhlcywgYnV0IGlmIAotCSAqIGEgLnByb3BlcnRpZXMgZmlsZSBoYXMgdmFyaWF0aW9ucyBvZiBhIG1lc3NhZ2UgKHNsaWdodGx5IGRpZmZlcmVudCAKLQkgKiB3b3JkaW5nIGZvciBhIGRpZmZlcmVudCBjb250ZXh0KSwgdGhlbiB0aGUgbnVtYmVyIG9mIHByZWZpeGVzIHdpbGwgCi0JICogYmUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiB1bmlxdWUgcHJlZml4ZXNzLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtUHJlZml4ZXMoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0UHJvcGVydHlMaW5lcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBtZXNzYWdlcyB0aGF0IGRvIG5vdCB1c2UgcHJlZml4ZXMgaW4gdGhlIGZpbGUuCi0JICovCi0JcHVibGljIGludCBnZXROdW1XaXRob3V0UHJlZml4ZXMoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0UHJvcGVydHlMaW5lcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKCFsaW5lLmhhc01lc3NhZ2VQcmVmaXgoKSkgewotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIExpc3Qgb2YgdGhlIFByb3BlcnR5TGluZSBpbnN0YW5jZXMgY29udGFpbmVkIGluIHRoaXMgZmlsZS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eUxpbmVzKCkgewotCQlyZXR1cm4gX3Byb3BlcnR5TGluZXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgUHJvcGVydHlMaW5lIGluc3RhbmNlIHRoYXQgaXMgaWRlbnRpZmllZCBieSB0aGUgCi0JICogZ2l2ZW4gbWVzc2FnZUlkLgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUxpbmUgZ2V0UHJvcGVydHlMaW5lKFN0cmluZyBtZXNzYWdlSWQpIHsKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlSWRDb21wYXJhdG9yKCkpOwotCQlpbnQgaW5kZXggPSBDb2xsZWN0aW9ucy5iaW5hcnlTZWFyY2goX3Byb3BlcnR5TGluZXMsIG1lc3NhZ2VJZCwgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlSWRDb21wYXJhdG9yKCkpOwotCQlpZihpbmRleCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlQcm9wZXJ0eUxpbmUgcmVzdWx0ID0gKFByb3BlcnR5TGluZSlfcHJvcGVydHlMaW5lcy5nZXQoaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBmaWxlIHRvIGNyZWF0ZSBhIGNvbGxlY3Rpb24gb2YgdW5pcXVlbHkgaWRlbnRpZmllZCAKLQkgKiBrZXlzIHdpdGggdGhlaXIgYXNzb2NpYXRlZCB2YWx1ZXMuIElmIHRoZXJlIGFyZSBhbnkgZHVwbGljYXRlIAotCSAqIGtleXMsIHRoZSBsYXN0IHZhbHVlIGlzIHRoZSBvbmUgdGhhdCBpcyBzdG9yZWQuIFN0b3JlIHRoZSAKLQkgKiB2YWx1ZSBvZiB0aGUgZHVwbGljYXRlIGtleXMsIGFuZCB0aGUgbGluZSBudW1iZXIgb24gd2hpY2ggCi0JICogZWFjaCBpbnN0YW5jZSBvZiB0aGUga2V5IChhbmQgaXRzIHZhbHVlKSBhcmUgbG9jYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUZpbGUoRmlsZSBwcm9wZXJ0eUZpbGUpIHsKLQkJRmlsZVJlYWRlciBpbnB1dCA9IG51bGw7Ci0JCUxpbmVOdW1iZXJSZWFkZXIgbGluZUlucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IEZpbGVSZWFkZXIocHJvcGVydHlGaWxlKTsKLQkJfQotCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdlIGNhbiBpZ25vcmUgdGhpcyBleGNlcHRpb24gYmVjYXVzZSB3ZSBoYXZlIGFscmVhZHkgY2hlY2tlZCBpbiB0aGUgY29uc3RydWN0b3IgdGhhdCB0aGUKLQkJCS8vIGZpbGUgZXhpc3RzLgotCQl9Ci0KLQkJLy8gQmVjYXVzZSB3ZSB3YW50IHRvIHJlYWQgaW4gYSBsaW5lIGF0IGEgdGltZSBmcm9tIHRoZSBmaWxlLCBjb252ZXJ0IHRoZSBGaWxlUmVhZGVyIHRvIGEgTGluZVJlYWRlcgotCQlsaW5lSW5wdXQgPSBuZXcgTGluZU51bWJlclJlYWRlcihpbnB1dCk7Ci0JCQotCQlwYXJzZUZpbGUobGluZUlucHV0KTsKLQkJCi0JCXRyeSB7Ci0JCQlsaW5lSW5wdXQuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCWlucHV0ID0gbnVsbDsKLQkJbGluZUlucHV0ID0gbnVsbDsKLQl9Ci0JCQotCS8qKgotCSAqIEdpdmVuIGEgTGluZU51bWJlclJlYWRlciBvbiBhIC5wcm9wZXJ0aWVzIGZpbGUsIHJlYWQgdGhlCi0JICogZmlsZSBhbmQgbm90ZSBhbnkgcHJvYmxlbXMgdGhhdCBtYXkgbmVlZCB0byBiZSByZXBvcnRlZCB0bwotCSAqIHRoZSB1c2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhcnNlRmlsZShMaW5lTnVtYmVyUmVhZGVyIGxpbmVJbnB1dCkgewotCQlfcHJvcGVydHlMaW5lcy5jbGVhcigpOwotCQlfcGFyc2VXYXJuaW5ncy5jbGVhcigpOwotCi0JCWJvb2xlYW4gaXNOZXdLZXkgPSB0cnVlOwotCQlTdHJpbmcga2V5ID0gbnVsbDsKLQkJaW50IGxpbmVOdW1iZXIgPSAwOwotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gMDsgLy8gZWFjaCAucHJvcGVydGllcyBsaW5lIG5lZWRzIHRvIGtub3cgaXRzIG9mZnNldCBzbyB0aGF0IGNvbHVtbnMgaW4gdGhlIGxpbmUgY2FuIGJlIGNhbGN1bGF0ZWQuCi0JCWludCBtZXNzYWdlT2Zmc2V0ID0gMDsgLy8gdGhlIG9mZnNldCwgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLCB3aGVyZSB0aGUgbWVzc2FnZSBwcmVmaXggc3RhcnRzCi0JCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCXRyeSB7Ci0JCQkJbGluZSA9IGxpbmVJbnB1dC5yZWFkTGluZSgpOyAvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBpbiB0aGUgZmluYWxseSBibG9jawotCQkJCWlmIChsaW5lID09IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCWxpbmUgPSBsaW5lLnRyaW0oKTsKLQotCQkJCS8vIGlnbm9yZSBibGFuayBsaW5lcwotCQkJCWlmIChsaW5lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGludWU7Ci0KLQkJCQkvLyBzdHJpcCBvZmYgbGluZXMgdGhhdCBiZWdpbiB3aXRoICcjJwotCQkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQljb250aW51ZTsKLQotCQkJCS8vIHN0cmlwIG9mZiBsaW5lcyB0aGF0IGJlZ2luIHdpdGggJy8nCi0JCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKGlzTmV3S2V5KSB7Ci0JCQkJCS8vIFdlIGtub3cgdGhhdCB0aGUgbGluZSBpcyBvZiB0aGUgZm9ybQotCQkJCQkvLwotCQkJCQkvLyBLRVlOQU1FID0gVkFMVUUKLQkJCQkJLy8KLQkJCQkJaWYgKGxpbmUuaW5kZXhPZihFUVVBTFMpICE9IC0xKSB7Ci0JCQkJCQkvLyBNYWtlIHN1cmUgdGhlIGxpbmUgaXMgbm90IG9mIHRoZSBmb3JtICIgPSBNZXNzYWdlIiAoaS5lLiwgbWlzc2luZyB0aGUgbWVzc2FnZSBpZCkuCi0JCQkJCQlpZihsaW5lLmluZGV4T2YoRVFVQUxTKSA9PSAwKSB7Ci0JCQkJCQkJdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIFRoZSB1c2VyIG1heSBvciBtYXkgbm90IHB1dCBzcGFjZXMgYmV0d2VlbiB0aGUga2V5Ci0JCQkJCQkvLyBuYW1lLCB0aGUgZXF1YWxzIHNpZ24sIGFuZCB0aGUgdmFsdWUuIFRoaXMgZ2l2ZXMgdXMgZm91ciBjYXNlczoKLQkJCQkJCS8vICAgIDEuIGtleW5hbWU9dmFsdWUKLQkJCQkJCS8vICAgIDIuIGtleW5hbWU9IHZhbHVlCi0JCQkJCQkvLyAgICAzLiBrZXluYW1lID12YWx1ZQotCQkJCQkJLy8gICAgNC4ga2V5bmFtZSA9IHZhbHVlCi0JCQkJCQkvLyBUaGUgd2F5IHRvIGRlYWwgd2l0aCBhbGwgZm91ciBjYXNlcyBpcyB0byBmaW5kIHRoZSBpbmRleCBvZiB0aGUKLQkJCQkJCS8vICc9JyBzaWduLCBhbmQgdGhlIHZhbHVlIGlzIHRoZSByZW1haW5kZXIgb2YgdGhlIGxpbmUgYWZ0ZXIgdGhlCi0JCQkJCQkvLyBzaWduLgotCQkJCQkJLy8KLQkJCQkJCWtleSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUuaW5kZXhPZihFUVVBTFMpKTsKLQkJCQkJCWtleSA9IGtleS50cmltKCk7Ci0KLQkJCQkJCS8vIGFkZCAxIHRvIHRoZSBFUVVBTFMgaW5kZXggYmVjYXVzZSAnPScgaXMgb25lIGNoYXJhY3RlciBsb25nCi0JCQkJCQl2YWx1ZSA9IGxpbmUuc3Vic3RyaW5nKGxpbmUuaW5kZXhPZihFUVVBTFMpICsgMSk7Ci0JCQkJCQl2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKLQotCQkJCQkJbWVzc2FnZU9mZnNldCA9IGxpbmUuaW5kZXhPZih2YWx1ZSk7Ci0KLQkJCQkJCWxpbmVOdW1iZXIgPSBsaW5lSW5wdXQuZ2V0TGluZU51bWJlcigpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gZXJyb3IgaW4gbGluZSBzeW50YXgKLQkJCQkJCXRocm93IG5ldyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBuZWVkIHRvIHJlYWQgaW4gdGhlIG11bHRpcGxlIGxpbmVzIHRvIGdldCB0aGUgbXVsdGktbGluZSB2YWx1ZQotCQkJCQl2YWx1ZSArPSBsaW5lOwotCQkJCX0KLQotCQkJCWlmICh2YWx1ZS5lbmRzV2l0aCgiXFwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIG11bHRpLWxpbmUgdmFsdWUKLQkJCQkJLy8gcmVhZCBpbiBldmVyeSBsaW5lIGZyb20gdGhlIGZpbGUgdW50aWwgeW91IHJlYWNoIGFuIGVuZC1vZi1saW5lCi0JCQkJCWlzTmV3S2V5ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBlbmQgb2YgbXVsdGktbGluZSB2YWx1ZSwgb3IgZW5kIG9mIHNpbmdsZS1saW5lIHZhbHVlCi0JCQkJCWlzTmV3S2V5ID0gdHJ1ZTsKLQkJCQkJUHJvcGVydHlMaW5lIHBsaW5lID0gbmV3IFByb3BlcnR5TGluZSh0aGlzLCBvZmZzZXQsIG1lc3NhZ2VPZmZzZXQsIGtleSwgdmFsdWUsIGxpbmVOdW1iZXIpOwotCQkJCQlfcHJvcGVydHlMaW5lcy5hZGQocGxpbmUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gV2hlbiB0aGVyZSBpcyBhbiBJT0V4Y2VwdGlvbiwgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCS8vIElmIGEgbGluZSBpcyBub3Qgb2YgdGhlIGZvcm0gS0VZTkFNRSA9IFZBTFVFLCB0aGVyZSBtaWdodCBiZSBhIG51bGwgZXhjZXB0aW9uLgotCQkJCS8vIEp1c3QgY29udGludWUgb250byB0aGUgbmV4dCBsaW5lIGluIHRoZSBmaWxlCi0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLkVSUk9SLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA4MCwgbnVsbCwgdGhpcywgbGluZUlucHV0LmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJcmVwb3J0KG1tZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vIElmIGEgbGluZSBpcyBub3Qgb2YgdGhlIGZvcm0gS0VZTkFNRSA9IFZBTFVFLCB0aGVyZSBtaWdodCBiZSBhIE5vU3VjaEVsZW1lbnQgZXhjZXB0aW9uLgotCQkJCS8vIEp1c3QgY29udGludWUgb250byB0aGUgbmV4dCBsaW5lIGluIHRoZSBmaWxlCi0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLkVSUk9SLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA4MCwgbnVsbCwgdGhpcywgbGluZUlucHV0LmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJcmVwb3J0KG1tZCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihsaW5lICE9IG51bGwpIHsKLQkJCQkJb2Zmc2V0ICs9IGxpbmUubGVuZ3RoKCkgKyAyOyAvLyBoYWNrLiAKLQkJCQkJLy8gQ2FuJ3QgZ2V0IG9mZnNldCBmcm9tIEJ1ZmZlcmVkUmVhZGVyLCBhbmQgc2luY2UgdGhlIHJlYWRlciBzdHJpcHMgCi0JCQkJCS8vIHRoZSAnXG4nIGFuZCAnXHInIGZyb20gdGhlIGxpbmUgYmVmb3JlIHRoZSBsaW5lIGlzIHJldHVybmVkLCB0aGUgCi0JCQkJCS8vIHRydWUgbGVuZ3RoIG9mIHRoZSBsaW5lIGNhbid0IGJlIGFzY2VydGFpbmVkLiBUaGlzIGhhY2sgd2lsbCBub3QgCi0JCQkJCS8vIHdvcmsgb24gVW5peCBiZWNhdXNlIHVuaXgncyBFT0wgY2hhciBpcyBkaWZmZXJlbnQgdGhhbiBXaW5kb3dzLgotCQkJCQkvLwotCQkJCQkvLyBXaGVuIHRoZXJlJ3MgdGltZSwgbmVlZCB0byBmaW5kIGFuIGFsdGVybmF0aXZlIHRvIExpbmVOdW1iZXJSZWFkZXIuCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiBhbGwgbWVzc2FnZSBwcmVmaXhlcywgZS5nLiwgQUJDRDAwMDBFLCB0aGF0IGFyZSB1c2VkCi0JICogaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBbGxNZXNzYWdlUHJlZml4ZXMoKSB7Ci0JCXJlcG9ydCgiTGluZSBOdW1iZXJcdE1lc3NhZ2UgcHJlZml4XHRNZXNzYWdlIGlkIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZigobGluZS5nZXRNZXNzYWdlUHJlZml4KCkgIT0gbnVsbCkgJiYgKCFsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoU3RyaW5nLnZhbHVlT2YobGluZS5nZXRMaW5lTnVtYmVyKCkpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQobGluZS5nZXRNZXNzYWdlSWQoKSk7Ci0JCQkJcmVwb3J0KGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiBhbGwgb2YgdGhlIG1lc3NhZ2UgcHJlZml4ZXMsIGUuZy4sIEFCQ0QxMTExRSwgCi0JICogdGhhdCBhcmUgbm90IHVzZWQgaW4gdGhlIGZpbGUuIEEgbWVzc2FnZSBwcmVmaXggaXMgY29uc2lkZXJlZAotCSAqICZxdW90O21pc3NpbmcmcXVvdDsgaWYgYSBtZXNzYWdlIHByZWZpeCB0aGF0IHByZWNlZGVzIGl0LCAKLQkgKiBlLmcuIEFCQ0QwMDAwRSwgYW5kIGEgbWVzc2FnZSBwcmVmaXggdGhhdCBmb2xsb3dzIGl0LCAKLQkgKiBlLmcuIEFCQ0QyMjIyRSwgYXJlIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSwgYnV0IHRoZSBwcmVmaXggaXMgbm90LgotCSAqIFRoaXMgbGlzdCBpcyB1c2VmdWwgd2hlbiBhZGRpbmcgYSBuZXcgbWVzc2FnZSB0byB0aGUgZmlsZTsKLQkgKiB0aGUgcHJlZml4ZXMgcHJpbnRlZCBieSB0aGlzIG1ldGhvZCBhcmUgdW51c2VkIGFuZCBvbmUgY2FuIGJlCi0JICogc2VsZWN0ZWQgZm9yIHRoZSBuZXcgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50QWxsTWlzc2luZ01lc3NhZ2VQcmVmaXhlcygpIHsKLQkJaW50IGxhc3ROdW1iZXIgPSAtMTsKLQkJCi0JCUNvbGxlY3Rpb25zLnNvcnQoX3Byb3BlcnR5TGluZXMsIFByb3BlcnR5TGluZUNvbXBhcmF0b3IuZ2V0TWVzc2FnZVByZWZpeENvbXBhcmF0b3IoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIHByZWZpeCA9IGxpbmUuZ2V0TWVzc2FnZVByZWZpeCgpOwotCQkJaW50IHByZWZpeE51bWJlciA9IDA7Ci0JCQlpZihwcmVmaXggPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZihwcmVmaXguZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBwcmVmaXhMZXR0ZXJzID0gcHJlZml4LnN1YnN0cmluZygwLCA0KTsgLy8gIkFCQ0QiIG9mICJBQkNEMDAwMFciCi0JCQl0cnkgewotCQkJCS8vIFJlOiBtYWdpYyBudW1iZXJzICI0IiBhbmQgIjgiIGJlbG93LgotCQkJCS8vIFNpbmNlIHRoZSBtZXNzYWdlIHByZWZpeCBpcyBvZiB0aGUgZm9ybSBBQkNEMDAwMEUsCi0JCQkJLy8gc3RyaXAgb2ZmIHRoZSBmaXJzdCBmb3VyIGNoYXJhY3RlcnMgdXAgdG8gKGFuZCBleGNsdWRpbmcpIHRoZSAKLQkJCQkvLyBlaWdodGggY2hhcmFjdGVyLCAiRSIuCi0JCQkJcHJlZml4TnVtYmVyID0gSW50ZWdlci5wYXJzZUludChwcmVmaXguc3Vic3RyaW5nKDQsIDgpKTsKLQkJCX0KLQkJCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8ganVzdCBjb250aW51ZQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYobGFzdE51bWJlciAhPSAtMSkgewotCQkJCWlmKHByZWZpeE51bWJlciAhPSAobGFzdE51bWJlciArIDEpKSB7Ci0JCQkJCS8vIFN0YXJ0IGF0IGxhc3ROdW1iZXIgKyAxIGJlY2F1c2UgbGFzdE51bWJlciBleGlzdHMuCi0JCQkJCS8vIEV4Y2x1ZGUgcHJlZml4TnVtYmVyIGJlY2F1c2UgcHJlZml4TnVtYmVyIGV4aXN0cy4KLQkJCQkJZm9yKGludCBpPWxhc3ROdW1iZXIrMTsgaTxwcmVmaXhOdW1iZXI7IGkrKykgewotCQkJCQkJcmVwb3J0KHByZWZpeExldHRlcnMgKyBpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWxhc3ROdW1iZXIgPSBwcmVmaXhOdW1iZXI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSAucHJvcGVydGllcyBmaWxlIHRoYXQgdXNlCi0JICogYSBtZXNzYWdlIHByZWZpeCwgZS5nLiBBQkNEMDAwMEUuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBbGxNZXNzYWdlc1dpdGhBTWVzc2FnZVByZWZpeCgpIHsKLQkJcmVwb3J0KCJNRVNTQUdFUyBXSVRIIFBSRUZJWEVTIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRMaW5lTm9Db21wYXJhdG9yKCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9wcm9wZXJ0eUxpbmVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJcmVwb3J0KGxpbmUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSAucHJvcGVydGllcyBmaWxlIHdob3NlIG1lc3NhZ2UKLQkgKiB0ZXh0IGRvZXMgbm90IGJlZ2luIHdpdGggYSBtZXNzYWdlIHByZWZpeCwgZS5nLiwgQUJDRDAwMDBFLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50QWxsTWVzc2FnZXNXaXRob3V0QU1lc3NhZ2VQcmVmaXgoKSB7Ci0JCXJlcG9ydCgiQkxBTksgTUVTU0FHRSBQUkVGSVgiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldExpbmVOb0NvbXBhcmF0b3IoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoIWxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJcmVwb3J0KGxpbmUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgYSBsaXN0IG9mIGFsbCBtZXNzYWdlcyB3aG9zZSB0ZXh0IGlzIHRoZSBlbXB0eSBzdHJpbmcgKCZxdW90OyZxdW90OykuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBbGxNZXNzYWdlc1doaWNoQXJlQmxhbmsoKSB7Ci0JCXJlcG9ydCgiQkxBTksgTUVTU0FHRVMiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldExpbmVOb0NvbXBhcmF0b3IoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYobGluZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoImxpbmUgbnVtYmVyICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiLCBtZXNzYWdlIGlkICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldE1lc3NhZ2VJZCgpKTsKLQkJCQlyZXBvcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiB0aGUgbGluZXMgdGhhdCBoYXZlIHN5bnRheCBlcnJvcnMsIGZvciBleGFtcGxlLAotCSAqIG1pc3NpbmcgdGhlIGVxdWFscyBzaWduIGJldHdlZW4gdGhlIG1lc3NhZ2UgaWQgYW5kIHRoZSBtZXNzYWdlIAotCSAqIHRleHQuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTeW50YXhXYXJuaW5ncygpIHsKLQkJTGlzdCBwYXJzZVdhcm5pbmdzID0gZ2V0UGFyc2VXYXJuaW5ncygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHBhcnNlV2FybmluZ3MuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmVwb3J0KChNZXNzYWdlTWV0YURhdGEpaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSAucHJvcGVydGllcyBmaWxlIHRoYXQKLQkgKiB1c2UgdGhlIHNhbWUgbWVzc2FnZSBpZC4gSWYgbW9yZSB0aGFuIG9uZSBtZXNzYWdlIHVzZXMgdGhlIHNhbWUKLQkgKiBpZCwgd2hlbiB0aGUgUmVzb3VyY2VCdW5kbGUgaXMgYXNrZWQgZm9yIHRoYXQgbWVzc2FnZSBpZCwgaXQgd2lsbAotCSAqIHJldHVybiB0aGUgbGFzdCBtZXNzYWdlIChpLmUuLCB0aGUgbGFyZ2VzdCBsaW5lIG51bWJlcikgd2l0aCB0aGF0Ci0JICogaWQgaW4gdGhlIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoKSB7Ci0JCXByaW50RHVwbGljYXRlTWVzc2FnZUlkKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBQcmludCBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGUgLnByb3BlcnRpZXMgZmlsZSB0aGF0Ci0JICogdXNlIHRoZSBzYW1lIG1lc3NhZ2UgaWQuIElmIG1vcmUgdGhhbiBvbmUgbWVzc2FnZSB1c2VzIHRoZSBzYW1lCi0JICogaWQsIHdoZW4gdGhlIFJlc291cmNlQnVuZGxlIGlzIGFza2VkIGZvciB0aGF0IG1lc3NhZ2UgaWQsIGl0IHdpbGwKLQkgKiByZXR1cm4gdGhlIGxhc3QgbWVzc2FnZSAoaS5lLiwgdGhlIGxhcmdlc3QgbGluZSBudW1iZXIpIHdpdGggdGhhdAotCSAqIGlkIGluIHRoZSBmaWxlLgotCSAqIAotCSAqIFRoZSBib29sZWFuIHBhcmFtZXRlciBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCAKLQkgKiB0aGUgJnF1b3Q7RFVQTElDQVRFIE1FU1NBR0UgSURTJnF1b3Q7IHRpdGxlIGlzIGVtaXR0ZWQgYmVmb3JlIAotCSAqIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoYm9vbGVhbiBwcmludFRpdGxlKSB7Ci0JCWlmKHByaW50VGl0bGUpIHsKLQkJCXJlcG9ydCgiRFVQTElDQVRFIE1FU1NBR0UgSURTIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKTsKLQkJU3RyaW5nIG1lc3NhZ2VJZCA9IElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDYwOwotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBjKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQlQcm9wZXJ0eUxpbmUgbGFzdExpbmUgPSBudWxsOwotCQlQcm9wZXJ0eUxpbmUgbGluZSA9IG51bGw7Ci0JCWJvb2xlYW4gbmVlZFRvUHJpbnRMYXN0ID0gZmFsc2U7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGFzdExpbmUgPSBsaW5lOwotCQkJbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlpZihjLmNvbXBhcmUobGFzdExpbmUsIGxpbmUpID09IDApIHsKLQkJCQluZWVkVG9QcmludExhc3QgPSB0cnVlOwotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5XQVJOSU5HLCBtZXNzYWdlSWQsIG5ldyBTdHJpbmdbXXtsYXN0TGluZS5nZXRNZXNzYWdlSWQoKX0sIGxhc3RMaW5lLCBsYXN0TGluZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCXJlcG9ydChtbWQpOwotCQkJfQotCQkJZWxzZSBpZihuZWVkVG9QcmludExhc3QpIHsKLQkJCQkvLyBUaGUgbGFzdCBkdXBsaWNhdGUgbGluZSBuZWVkcyB0byBiZSBwcmludGVkLCBiZWNhdXNlIGxhc3RMaW5lIGlzIGFsd2F5cyBwcmludGVkIGJ1dCBsaW5lIG5lZWRzIHRvIGJlIHByaW50ZWQgdG9vLgotCQkJCW5lZWRUb1ByaW50TGFzdCA9IGZhbHNlOwotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5XQVJOSU5HLCBtZXNzYWdlSWQsIG5ldyBTdHJpbmdbXXtsYXN0TGluZS5nZXRNZXNzYWdlSWQoKX0sIGxhc3RMaW5lLCBsYXN0TGluZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCXJlcG9ydChtbWQpOwotCQkJfQotCQl9Ci0KLQkJaWYobmVlZFRvUHJpbnRMYXN0KSB7Ci0JCQkvLyBUaGUgbGFzdCBkdXBsaWNhdGUgbGluZSBuZWVkcyB0byBiZSBwcmludGVkLCBiZWNhdXNlIGxhc3RMaW5lIGlzIGFsd2F5cyBwcmludGVkIGJ1dCBsaW5lIG5lZWRzIHRvIGJlIHByaW50ZWQgdG9vLgotCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLldBUk5JTkcsIG1lc3NhZ2VJZCwgbmV3IFN0cmluZ1tde2xpbmUuZ2V0TWVzc2FnZUlkKCl9LCBsaW5lLCBsaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQlyZXBvcnQobW1kKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcmludCBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGUgLnByb3BlcnRpZXMgZmlsZSB0aGF0Ci0JICogZG8gbm90IHVzZSBhIHVuaXF1ZSBtZXNzYWdlIHByZWZpeCAoZS5nLiwgQUJDRDAwMDBFKSwgd2l0aCB0aGUgCi0JICogZXhjZXB0aW9uIG9mIGFsbCBtZXNzYWdlcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgZHVwbGljYXRlcy4KLQkgKiBHZW5lcmFsbHksIHVzZXJzIGV4cGVjdCBvbmUgbWVzc2FnZSBwcmVmaXggcGVyIHByb2JsZW0sIHNvIAotCSAqIHJldXNlZCBtZXNzYWdlIHByZWZpeGVzIGNhbiBiZSBjb25mdXNpbmcuIEFueSBtZXNzYWdlIHdoaWNoIAotCSAqIGRlbGliZXJhdGVseSByZXVzZXMgYSBtZXNzYWdlIHByZWZpeCBtdXN0IHVzZSBhIG1lc3NhZ2UgaWQgCi0JICogdGhhdCBzdGFydHMgd2l0aCB0aGF0IHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludER1cGxpY2F0ZU1lc3NhZ2VQcmVmaXgoKSB7Ci0JCXByaW50RHVwbGljYXRlTWVzc2FnZVByZWZpeCh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgYSBsaXN0IG9mIGFsbCBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUgdGhhdAotCSAqIGRvIG5vdCB1c2UgYSB1bmlxdWUgbWVzc2FnZSBwcmVmaXggKGUuZy4sIEFCQ0QwMDAwRSksIHdpdGggdGhlIAotCSAqIGV4Y2VwdGlvbiBvZiBhbGwgbWVzc2FnZXMgd2hpY2ggYXJlIGludGVuZGVkIHRvIGJlIGR1cGxpY2F0ZXMuCi0JICogR2VuZXJhbGx5LCB1c2VycyBleHBlY3Qgb25lIG1lc3NhZ2UgcHJlZml4IHBlciBwcm9ibGVtLCBzbyAKLQkgKiByZXVzZWQgbWVzc2FnZSBwcmVmaXhlcyBjYW4gYmUgY29uZnVzaW5nLiBBbnkgbWVzc2FnZSB3aGljaCAKLQkgKiBkZWxpYmVyYXRlbHkgcmV1c2VzIGEgbWVzc2FnZSBwcmVmaXggbXVzdCB1c2UgYSBtZXNzYWdlIGlkIAotCSAqIHRoYXQgc3RhcnRzIHdpdGggdGhhdCBwcmVmaXguCi0JICogCi0JICogVGhlIGJvb2xlYW4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IAotCSAqIHRoZSAmcXVvdDtEVVBMSUNBVEUgTUVTU0FHRSBQUkVGSVhFU1MmcXVvdDsgdGl0bGUgaXMgZW1pdHRlZCAKLQkgKiBiZWZvcmUgdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy4KLQkgKi8JCi0JcHVibGljIHZvaWQgcHJpbnREdXBsaWNhdGVNZXNzYWdlUHJlZml4KGJvb2xlYW4gcHJpbnRUaXRsZSkgewotCQlpZihwcmludFRpdGxlKSB7Ci0JCQlyZXBvcnQoIkRVUExJQ0FURSBNRVNTQUdFIFBSRUZJWEVTIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoX3Byb3BlcnR5TGluZXMsIGMpOwotCQlTdHJpbmcgbWVzc2FnZUlkID0gSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwNzA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJUHJvcGVydHlMaW5lIGxhc3RMaW5lID0gbnVsbDsKLQkJUHJvcGVydHlMaW5lIGxpbmUgPSBudWxsOwotCQlib29sZWFuIG5lZWRUb1ByaW50TGFzdCA9IGZhbHNlOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWxhc3RMaW5lID0gbGluZTsKLQkJCWxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQotCQkJaWYobGFzdExpbmUgIT0gbnVsbCkgewotCQkJCWlmKCFsYXN0TGluZS5nZXRNZXNzYWdlSWQoKS5zdGFydHNXaXRoKGxhc3RMaW5lLmdldFNob3J0TWVzc2FnZVByZWZpeCgpKSkgewotCQkJCQlpZihjLmNvbXBhcmUobGFzdExpbmUsIGxpbmUpID09IDApIHsKLQkJCQkJCW5lZWRUb1ByaW50TGFzdCA9IHRydWU7Ci0JCQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuV0FSTklORywgbWVzc2FnZUlkLCBuZXcgU3RyaW5nW117bGFzdExpbmUuZ2V0TWVzc2FnZVByZWZpeCgpfSwgbGFzdExpbmUsIGxhc3RMaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJCQlyZXBvcnQobW1kKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmKG5lZWRUb1ByaW50TGFzdCkgewotCQkJCQkJLy8gVGhlIGxhc3QgZHVwbGljYXRlIGxpbmUgbmVlZHMgdG8gYmUgcHJpbnRlZCwgYmVjYXVzZSBsYXN0TGluZSBpcyBhbHdheXMgcHJpbnRlZCBidXQgbGluZSBuZWVkcyB0byBiZSBwcmludGVkIHRvby4KLQkJCQkJCW5lZWRUb1ByaW50TGFzdCA9IGZhbHNlOwotCQkJCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLldBUk5JTkcsIG1lc3NhZ2VJZCwgbmV3IFN0cmluZ1tde2xhc3RMaW5lLmdldE1lc3NhZ2VQcmVmaXgoKX0sIGxhc3RMaW5lLCBsYXN0TGluZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCQkJcmVwb3J0KG1tZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZihsYXN0TGluZSAhPSBudWxsKSB7Ci0JCQlpZighbGFzdExpbmUuZ2V0TWVzc2FnZUlkKCkuc3RhcnRzV2l0aChsYXN0TGluZS5nZXRTaG9ydE1lc3NhZ2VQcmVmaXgoKSkpIHsKLQkJCQlpZihuZWVkVG9QcmludExhc3QpIHsKLQkJCQkJLy8gVGhlIGxhc3QgZHVwbGljYXRlIGxpbmUgbmVlZHMgdG8gYmUgcHJpbnRlZCwgYmVjYXVzZSBsYXN0TGluZSBpcyBhbHdheXMgcHJpbnRlZCBidXQgbGluZSBuZWVkcyB0byBiZSBwcmludGVkIHRvby4KLQkJCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLldBUk5JTkcsIG1lc3NhZ2VJZCwgbmV3IFN0cmluZ1tde2xpbmUuZ2V0TWVzc2FnZVByZWZpeCgpfSwgbGluZSwgbGluZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCQlyZXBvcnQobW1kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCBhIGxpc3Qgb2YgbWVzc2FnZSBwcmVmaXhlcyB3aG9zZSBmaXJzdCBjaGFyYWN0ZXJzIG1hdGNoCi0JICogdGhlIHByZWZpeCBwYXJhbWV0ZXIuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlZQotCSAqIGlmIGEgcmFuZ2Ugb2YgcHJlZml4ZXMgaXMgaW4gdXNlIG9yIG5vdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludE1lc3NhZ2VQcmVmaXhTdGFydGluZ1dpdGgoZmluYWwgU3RyaW5nIHByZWZpeCkgewotCQlyZXBvcnQoIkZpbmQgYWxsIGVycm9yIHByZWZpeGVzIHN0YXJ0aW5nIHdpdGggIiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGFyYXRvciBjID0gUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpOwotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBjKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQlQcm9wZXJ0eUxpbmUgbGluZSA9IG51bGw7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGxpbmUuZ2V0TWVzc2FnZVByZWZpeCgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKFN0cmluZy52YWx1ZU9mKGxpbmUuZ2V0TGluZU51bWJlcigpKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQobGluZS5nZXRNZXNzYWdlUHJlZml4KCkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKGxpbmUuZ2V0TWVzc2FnZUlkKCkpOwotCQkJCXJlcG9ydChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgdGhlIGxhc3QgcHJlZml4IChpLmUuLCB0aGUgb25lIHdpdGggdGhlIGxhcmdlc3QgbnVtYmVyLCAKLQkgKiBlLmcuIEFCQ0QyMjIyIGlzIGxhcmdlciB0aGFuIEFCQ0QxMTExIG9yIEFCQ0QwMDAwKSBpbiB0aGUgZmlsZSAKLQkgKiB3aG9zZSBmaXJzdCBjaGFyYWN0ZXJzIG1hdGNoIHRoZSBwcmVmaXggcGFyYW1ldGVyLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludExhc3RNZXNzYWdlUHJlZml4U3RhcnRpbmdXaXRoKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmVwb3J0KCJGaW5kIGxhc3QgZXJyb3IgcHJlZml4IHN0YXJ0aW5nIHdpdGggIiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGFyYXRvciBjID0gUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpOwotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBjKTsKLQkJUHJvcGVydHlMaW5lW10gbGluZXMgPSBuZXcgUHJvcGVydHlMaW5lW19wcm9wZXJ0eUxpbmVzLnNpemUoKV07Ci0JCV9wcm9wZXJ0eUxpbmVzLnRvQXJyYXkobGluZXMpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvcihpbnQgaT1saW5lcy5sZW5ndGg7IGk+LTE7IGktLSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSBsaW5lc1tpXTsKLQkJCWlmIChsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLQkJCQlyZXBvcnQobGluZS50b1N0cmluZygpKTsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYoIWZvdW5kKSB7Ci0JCQlyZXBvcnQoIk5vIGVycm9yIGlkcyB3ZXJlIGZvdW5kIHRoYXQgc3RhcnRlZCB3aXRoICIgKyBwcmVmaXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSBzdWJzdGl0dXRpb24gcGFyYW1ldGVyLAotCSAqIHByaW50IGEgbGlzdCBvZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSBnaXZlbiBtZXNzYWdlLCBpZiBlYWNoIAotCSAqIHBhcmFtZXRlciBpcyByZXBsYWNlZCB3aXRoICZxdW90O2xlbmd0aCZxdW90OyBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50RXhwZWN0ZWRTdHJpbmdMZW5ndGgoZmluYWwgaW50IGxlbmd0aCkgewotCQlyZXBvcnQoIkVYUEVDVEVEIExFTkdUSCBPRiBNRVNTQUdFIFdJVEggUEFSQU1FVEVSUyAiICsgbGVuZ3RoICsgIiBMT05HIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldFN0cmluZ0xlbmd0aENvbXBhcmF0b3IobGVuZ3RoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgYyk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiTGVuZ3RoOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldEV4cGVjdGVkTGVuZ3RoKGxlbmd0aCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChsaW5lLnRvU3RyaW5nV2l0aEV4cGVjdGVkTGVuZ3RoKGxlbmd0aCkpOwotCQkJcmVwb3J0KGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBlYWNoIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdHJpbmdMZW5ndGgoKSB7Ci0JCS8vICIwIiBtZWFucyBubyBzdWJzdGl0dXRpb24KLQkJcHJpbnRFeHBlY3RlZFN0cmluZ0xlbmd0aCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgY29udGVudHMgb2YgdGhlIC5wcm9wZXJ0aWVzIGZpbGUsIHNvcnRlZCBieSBtZXNzYWdlIGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50Q29udGVudHMoKSB7Ci0JCXJlcG9ydCgiQ09OVEVOVFMgT0YgLnByb3BlcnRpZXMgRklMRSwgU09SVEVEIEJZIE1FU1NBR0UgSUQiKTsgLy8kTk9OLU5MUy0xJAotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgYyk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJcmVwb3J0KGxpbmUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL0NvbXBhcmVQcm9wZXJ0aWVzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL0NvbXBhcmVQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYWI0MTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Db21wYXJlUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlcjsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29tcGFyZXMgdHdvIC5wcm9wZXJ0aWVzIGZpbGUgYW5kIG91dHB1dHMgYSBsaXN0Ci0gKiBvZiB0aGUgZGlmZmVyZW5jZXMuIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb3VudCB0aGUgbnVtYmVyCi0gKiBvZiB3b3JkcyB0aGF0IGhhdmUgY2hhbmdlZC4KLSAqLwotcHVibGljIGNsYXNzIENvbXBhcmVQcm9wZXJ0aWVzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gamF2YS5sYW5nLlN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgVHJlZVNldCBfZGVsZXRlZCA9IG51bGw7Ci0JcHJpdmF0ZSBUcmVlTWFwIF9jaGFuZ2VkID0gbnVsbDsKLQlwcml2YXRlIFRyZWVTZXQgX2FkZGVkID0gbnVsbDsKLS8vCXByaXZhdGUgUHJvcGVydHlGaWxlIF9vbGRGaWxlID0gbnVsbDsKLQlwcml2YXRlIFByb3BlcnR5RmlsZSBfbmV3RmlsZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc3RvcmUgUHJvcGVydHlMaW5lIGluc3RhbmNlcyB3aGljaCBoYXZlIHRoZSBzYW1lCi0JICogbWVzc2FnZSBpZCwgYnV0IGRpZmZlcmVudCB2YWx1ZXMuIFdoZW4gdGhlIGxpc3Qgb2YgZGlmZmVyZW5jZXMgaXMgb3V0cHV0LAotCSAqIGFsbCB2YWx1ZXMgYXJlIG91dHB1dCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBjb21wYXJlIHRoZSBsaW5lcyBtYW51YWxseSwgdG8KLQkgKiBzZWUgd2hhdCdzIGRpZmZlcmVudC4KLQkgKi8KLQljbGFzcyBDb21wYXJlTGluZSBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCQlwcml2YXRlIEFycmF5TGlzdCBfbGluZXM7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIF9tZXNzYWdlSWQ7Ci0KLQkJcHVibGljIENvbXBhcmVMaW5lKFN0cmluZyBtZXNzYWdlSWQpIHsKLQkJCV9tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7Ci0JCQlfbGluZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGQoUHJvcGVydHlMaW5lIG9sZExpbmUsIFByb3BlcnR5TGluZSBuZXdMaW5lKSB7Ci0JCQlfbGluZXMuYWRkKG5ldyBQcm9wZXJ0eUxpbmVbXXtvbGRMaW5lLCBuZXdMaW5lfSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX2xpbmVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlMaW5lW10gbGluZXMgPSAoUHJvcGVydHlMaW5lW10paXRlcmF0b3IubmV4dCgpOwotCQkJCQotCQkJCWJ1ZmZlci5hcHBlbmQobGluZXNbMF0pOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKGxpbmVzWzFdKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB0aGlzIGlzIGEgY2hhbmdlZCBzdHJpbmcsIHJldHVybiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBvZiB3b3JkcyBiZXR3ZWVuIHRoZSBzdHJpbmdzLgotCQkgKi8JCQotCQlwdWJsaWMgaW50IGdldE51bVdvcmRzKCkgewotCQkJaW50IG51bVdvcmRzID0gMDsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX2xpbmVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJUHJvcGVydHlMaW5lW10gbGluZXMgPSAoUHJvcGVydHlMaW5lW10paXRlcmF0b3IubmV4dCgpOwotCQkJCW51bVdvcmRzID0gbnVtV29yZHMgKyBjb21wYXJlKGxpbmVzWzBdLCBsaW5lc1sxXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtV29yZHM7Ci0JCX0KLQkJCi0JCXByaXZhdGUgaW50IGNvbXBhcmUoUHJvcGVydHlMaW5lIG9sZExpbmUsIFByb3BlcnR5TGluZSBuZXdMaW5lKSB7Ci0JCQkvLyBGb3IgZXZlcnkgd29yZCBpbiB0aGUgb2xkIHN0cmluZywgc2VlIGlmIGl0IGV4aXN0cyBpbiB0aGUgbmV3Ci0JCQkvLyBzdHJpbmcuIFRoZSBwb3NpdGlvbiBvZiB0aGUgd29yZCBkb2Vzbid0IG1hdHRlciAtIGlmIHRoZSB3b3JkCi0JCQkvLyBleGlzdHMgaW4gdGhlIG5ldywgdGhlbiB0aGUgd29yZCBpcyBub3QgY291bnRlZCBhcyBhICJjaGFuZ2VkIgotCQkJLy8gd29yZC4gCi0JCQkvLyAgICAxLiBJZiB0aGUgd29yZCBleGlzdHMsIHJlbW92ZSB0aGUgd29yZCBmcm9tIHRoZSBuZXdMaW5lIGFuZAotCQkJLy8gICAgICAgYWR2YW5jZSB0byB0aGUgbmV4dCBvbGQgdG9rZW4uIChSZW1vdmUgd29yZCBmcm9tIG5ld0xpbmUKLQkJCS8vICAgICAgIGluIGNhc2UgdGhlIHdvcmQgZXhpc3RlZCB0d2ljZSBpbiB0aGUgb2xkIHN0cmluZyBidXQgb25seQotCQkJLy8gICAgICAgb25jZSBpbiB0aGUgbmV3LiBUaGUgc2Vjb25kIG9sZFdvcmQgc2hvdWxkIGJlIGNvdW50ZWQgYXMKLQkJCS8vICAgICAgIGEgY2hhbmdlZCB3b3JkLikKLQkJCS8vICAgIDIuIElmIHRoZSB3b3JkIGRvZXNuJ3QgZXhpc3QsIG51bUNoYW5nZWQrKyBhbmQgYWR2YW5jZSB0byB0aGUKLQkJCS8vICAgICAgIG5leHQgb2xkIHRva2VuLgotCQkJLy8gICAgMy4gT25jZSBhbGwgb2YgdGhlIG9sZFdvcmRzIGhhdmUgYmVlbiBjaGVja2VkLCB0b2tlbml6ZSB0aGUKLQkJCS8vICAgICAgIHJlbWFpbmluZyBuZXdXb3JkIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIHRoZSBzdHJpbmcuCi0JCQkvLyAgICAgICBUaGVzZSB3b3JkcyBoYXZlIGJlZW4gYWRkZWQgYW5kIGVhY2ggb25lIGNvdW50cyBhcyBhIAotCQkJLy8gICAgICAgY2hhbmdlZCB3b3JkLgotCQkJaW50IG51bUNoYW5nZWRXb3JkcyA9IDA7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgb2xkVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihvbGRMaW5lLmdldE1lc3NhZ2UoKSk7Ci0KLQkJCS8vIE5lZWQgdG8gYmUgY2FyZWZ1bC4uLndhbnQgdGhlIGVudGlyZSB3b3JkLCBub3Qgb2xkV29yZD0ib24iIG1pc3Rha2VuIGZvciBuZXdXb3JkPSJvbmUiIG9yIG5ld1dvcmQ9ImJvbmQiCi0JCQkvLyBFYXNpZXIgdG8gY3JlYXRlIGEgbGlzdCBvZiBuZXcgd29yZHMgdG8gY29tcGFyZSBhZ2FpbnN0LgotCQkJU3RyaW5nVG9rZW5pemVyIG5ld1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobmV3TGluZS5nZXRNZXNzYWdlKCkpOwotCQkJTGlzdCBuZXdXb3JkcyA9IG5ldyBBcnJheUxpc3QoKTsgLy8gQ2FuJ3QgdXNlIGEgc2V0IGluIGNhc2UgdGhlIG5ld0xpbmUgdXNlcyBhIHdvcmQsIGUuZy4gInRoZSIsIG1vcmUgdGhhbiBvbmNlLgotCQkJd2hpbGUobmV3VG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCW5ld1dvcmRzLmFkZChuZXdUb2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQkJCi0JCQl3aGlsZShvbGRUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIG9sZFdvcmQgPSBvbGRUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJaWYobmV3V29yZHMuY29udGFpbnMob2xkV29yZCkpIHsKLQkJCQkJbmV3V29yZHMucmVtb3ZlKG9sZFdvcmQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbnVtQ2hhbmdlZFdvcmRzKys7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBDYW4gY291bnQgdGhlIHRva2VucyBidXQgbm90IHRoZSBlbG1lbnRzLgotCQkJbnVtQ2hhbmdlZFdvcmRzICs9IG5ld1dvcmRzLnNpemUoKTsKLQkJCXJldHVybiBudW1DaGFuZ2VkV29yZHM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZCgpIHsKLQkJCXJldHVybiBfbWVzc2FnZUlkOwotCQl9Ci0KLQkJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJCS8vIGJ5IGRlZmF1bHQsIHNvcnQgYnkgbWVzc2FnZSBpZAotCQkJaWYgKCEobyBpbnN0YW5jZW9mIENvbXBhcmVMaW5lKSkgewotCQkJCS8vIHRoZW4gaG93IG9uIGVhcnRoIGRpZCB0aGlzIG1ldGhvZCBnZXQgY2FsbGVkPz8KLQkJCQkvLyBwdXQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlyZXR1cm4gZ2V0TWVzc2FnZUlkKCkuY29tcGFyZVRvKCgoQ29tcGFyZUxpbmUpIG8pLmdldE1lc3NhZ2VJZCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXBhcmUgdGhlIHR3byBQcm9wZXJ0eUZpbGUgYW5kIHByaW50IG91dCBhIGxpc3Qgb2YgdGhlIGRpZmZlcmVuY2VzOyAKLQkgKiB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBvbGRlciAucHJvcGVydGllcyBmaWxlLCBhbmQgdGhlIHNlY29uZCAKLQkgKiBwYXJhbWV0ZXIgaXMgdGhlIG5ld2VyIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHVibGljIENvbXBhcmVQcm9wZXJ0aWVzKFByb3BlcnR5RmlsZSBvbGRGaWxlLCBQcm9wZXJ0eUZpbGUgbmV3RmlsZSkgewotCQlfZGVsZXRlZCA9IG5ldyBUcmVlU2V0KCk7Ci0JCV9jaGFuZ2VkID0gbmV3IFRyZWVNYXAoKTsKLQkJX2FkZGVkID0gbmV3IFRyZWVTZXQoKTsKLQkJCi0vLwkJX29sZEZpbGUgPSBvbGRGaWxlOwotCQlfbmV3RmlsZSA9IG5ld0ZpbGU7Ci0KLQkJY29tcGFyZShvbGRGaWxlLCBuZXdGaWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogSW4gdGhlIG9sZGVyIFByb3BlcnR5RmlsZSwgdGhlIG1lc3NhZ2UgdGV4dCB3YXMgZGlmZmVyZW50OyBjYWNoZSB0aGUKLQkgKiBvbGRlciB2ZXJzaW9uIG9mIHRoZSBQcm9wZXJ0eUxpbmUgYW5kIHRoZSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBQcm9wZXJ0eUxpbmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENoYW5nZWQoUHJvcGVydHlMaW5lIG9sZExpbmUsIFByb3BlcnR5TGluZSBuZXdMaW5lKSB7Ci0JCUNvbXBhcmVMaW5lIGNsID0gKENvbXBhcmVMaW5lKSBfY2hhbmdlZC5nZXQob2xkTGluZS5nZXRNZXNzYWdlSWQoKSk7Ci0JCWlmIChjbCA9PSBudWxsKSB7Ci0JCQljbCA9IG5ldyBDb21wYXJlTGluZShvbGRMaW5lLmdldE1lc3NhZ2VJZCgpKTsKLQkJfQotCQljbC5hZGQob2xkTGluZSwgbmV3TGluZSk7Ci0JCV9jaGFuZ2VkLnB1dChvbGRMaW5lLmdldE1lc3NhZ2VJZCgpLCBjbCk7Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmUgdGhlIHR3byBwcm9wZXJ0eSBmaWxlcyBhbmQgYnVpbGQgdGhlIGNvbGxlY3Rpb25zIG9mIHZhcmlhYmxlIG5hbWVzIHdpdGgKLQkgKiB0aGVpciBhc3NvY2lhdGVkIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wYXJlKFByb3BlcnR5RmlsZSBvbGRGaWxlLCBQcm9wZXJ0eUZpbGUgbmV3RmlsZSkgewotCQlfYWRkZWQuY2xlYXIoKTsKLQkJX2RlbGV0ZWQuY2xlYXIoKTsKLQkJX2NoYW5nZWQuY2xlYXIoKTsKLQotCQkvLyBGb3IgZWFjaCBlbGVtZW50IGluIGZpbGUgMSwgc2VlIGlmIGl0IGV4aXN0cyBpbiBmaWxlIDIKLQkJLy8gICBhKSBpZiBpdCBkb2Vzbid0IGV4aXN0LCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgImRlbGV0ZWQiIHN0cmluZ3MKLQkJLy8gICBiKSBpZiBpdCBleGlzdHMsIGFuZCBpZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50LCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgImNoYW5nZWQiIHN0cmluZ3MKLQkJLy8gICBjKSBpZiBpdCBleGlzdHMsIGFuZCBpZiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGFkZCBpdCB0byB0aGUgbGlzdCBvZiAibm90IGNoYW5nZWQiIHN0cmluZ3MKLQkJLy8gICBkKSBkZWxldGUgdGhlIGVudHJ5LCBpZiBpdCBleGlzdHMsIGZyb20gZmlsZSAyJ3MgaGFzaHRhYmxlIHNvIHdlIGRvbid0IGNoZWNrIGl0IHR3aWNlLgotCQkvLyBGb3IgZWFjaCBlbGVtZW50IGluIGZpbGUgMiBub3QgY2hlY2tlZCBhbHJlYWR5LCBpdCBjYW5ub3QgZXhpc3QgaW4gZmlsZSAxLCBzbyBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgIm5ldyIgc3RyaW5ncwotCQkvLwotCQkvLyBOZWVkIHNvbWUgd2F5IHRvIGFib3J0IGNvbXBhcmlzb24gaWYgZWl0aGVyIG9mIHRoZSBmaWxlcyBjb250YWlucyBkdXBsaWNhdGUKLQkJLy8gbWVzc2FnZSBpZHMuCi0JCS8vCi0JCUxpc3Qgb2xkS2V5cyA9IG5ldyBBcnJheUxpc3Qob2xkRmlsZS5nZXRQcm9wZXJ0eUxpbmVzKCkpOwotCQlMaXN0IG5ld0tleXMgPSBuZXcgQXJyYXlMaXN0KG5ld0ZpbGUuZ2V0UHJvcGVydHlMaW5lcygpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChvbGRLZXlzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobmV3S2V5cywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlSWRDb21wYXJhdG9yKCkpOwotCQlJdGVyYXRvciBvbGRJdGVyYXRvciA9IG9sZEtleXMuaXRlcmF0b3IoKTsKLQkJSXRlcmF0b3IgbmV3SXRlcmF0b3IgPSBuZXdLZXlzLml0ZXJhdG9yKCk7Ci0JCVByb3BlcnR5TGluZSBvbGRMaW5lID0gKG9sZEl0ZXJhdG9yLmhhc05leHQoKSkgPyAoUHJvcGVydHlMaW5lKSBvbGRJdGVyYXRvci5uZXh0KCkgOiBudWxsOwotCQlQcm9wZXJ0eUxpbmUgbmV3TGluZSA9IChuZXdJdGVyYXRvci5oYXNOZXh0KCkpID8gKFByb3BlcnR5TGluZSkgbmV3SXRlcmF0b3IubmV4dCgpIDogbnVsbDsKLQkJd2hpbGUgKChvbGRMaW5lICE9IG51bGwpICYmIChuZXdMaW5lICE9IG51bGwpKSB7Ci0JCQkvLyBvbGRMaW5lIG1lc3NhZ2UgaWQgaXMgZWl0aGVyIDwsID0sIG9yID4gbmV3TGluZSBtZXNzYWdlIGlkLgotCQkJLy8gaWYgPCwgbWVzc2FnZSBpZCBoYXMgYmVlbiBkZWxldGVkLgotCQkJLy8gaWYgPSwgc2VlIGlmIGNoYW5nZWQgKG9yIGp1c3QgY29tcGFyZSBtZXNzYWdlIGlkcy4pCi0JCQkvLyBpZiA+LCBuZXcgbGluZSBpcyBhIG5ldyBtZXNzYWdlIGlkLgotCQkJLy8gdG8gaW5jcmVtZW50LCBpbmNyZW1lbnQgb25seSB0aGUgPCAod2hldGhlciBpdCdzIG9sZExpbmUgb3IgbmV3TGluZSkuCi0JCQlpbnQgY29tcGFyZSA9IG9sZExpbmUuZ2V0TWVzc2FnZUlkKCkuY29tcGFyZVRvKG5ld0xpbmUuZ2V0TWVzc2FnZUlkKCkpOwotCQkJaWYgKGNvbXBhcmUgPCAwKSB7Ci0JCQkJLy8gZGVsZXRlZAotCQkJCV9kZWxldGVkLmFkZChvbGRMaW5lKTsKLQkJCQlpZiAob2xkSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCW9sZExpbmUgPSAoUHJvcGVydHlMaW5lKSBvbGRJdGVyYXRvci5uZXh0KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvbGRMaW5lID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChjb21wYXJlID09IDApIHsKLQkJCQkvLyBleGlzdGVkIGJlZm9yZS4gQ2hlY2sgaWYgY2hhbmdlZC4KLQkJCQlpZiAoIW9sZExpbmUuZ2V0TWVzc2FnZSgpLmVxdWFscyhuZXdMaW5lLmdldE1lc3NhZ2UoKSkpIHsKLQkJCQkJLy8gY2hhbmdlZAotCQkJCQlhZGRDaGFuZ2VkKG9sZExpbmUsIG5ld0xpbmUpOwotCQkJCX0KLQkJCQlpZiAob2xkSXRlcmF0b3IuaGFzTmV4dCgpICYmIG5ld0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlvbGRMaW5lID0gKFByb3BlcnR5TGluZSkgb2xkSXRlcmF0b3IubmV4dCgpOwotCQkJCQluZXdMaW5lID0gKFByb3BlcnR5TGluZSkgbmV3SXRlcmF0b3IubmV4dCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJb2xkTGluZSA9IG51bGw7Ci0JCQkJCW5ld0xpbmUgPSBudWxsOwotCQkJCX0KLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gYWRkZWQKLQkJCQlfYWRkZWQuYWRkKG5ld0xpbmUpOwotCQkJCWlmIChuZXdJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJbmV3TGluZSA9IChQcm9wZXJ0eUxpbmUpIG5ld0l0ZXJhdG9yLm5leHQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5ld0xpbmUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChvbGRMaW5lICE9IG51bGwpIHsKLQkJCV9kZWxldGVkLmFkZChvbGRMaW5lKTsKLQkJfQotCi0JCWlmIChuZXdMaW5lICE9IG51bGwpIHsKLQkJCV9hZGRlZC5hZGQobmV3TGluZSk7Ci0JCX0KLQotCQl3aGlsZSAob2xkSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkvLyBhbGwgb2YgdGhlIHJlc3QgaGF2ZSBiZWVuIGRlbGV0ZWQKLQkJCV9kZWxldGVkLmFkZChvbGRJdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0KLQkJd2hpbGUgKG5ld0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJLy8gYWxsIG9mIHRoZSByZXN0IGhhdmUgYmVlbiBhZGRlZAotCQkJX2FkZGVkLmFkZChuZXdJdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIENvbGxjdGlvbiBvZiBQcm9wZXJ0eUxpbmUgaW5zdGFuY2VzIHRoYXQgZXhpc3QgaW4KLQkgKiB0aGUgbmV3ZXIgUHJvcGVydHlGaWxlIHRoYXQgYXJlbid0IGluIHRoZSBvbGRlciBQcm9wZXJ0eUZpbGUuCi0JICovCi0JcHVibGljIFNldCBnZXRBZGRlZCgpIHsKLQkJcmV0dXJuIF9hZGRlZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBDb21wYXJlTGluZSBpbnN0YW5jZXMgdGhhdCByZXByZXNlbnQKLQkgKiB0aGUgdHdvIFByb3BlcnR5TGluZSBpbnN0YW5jZXM7IG9uZSBmcm9tIHRoZSBvbGRlciBQcm9wZXJ0eUZpbGUsCi0JICogYW5kIG9uZSBmcm9tIHRoZSBuZXdlciBQcm9wZXJ0eUZpbGUuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hhbmdlZCgpIHsKLQkJcmV0dXJuIF9jaGFuZ2VkLnZhbHVlcygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBDb2xsZWN0aW9uIG9mIFByb3BlcnR5TGluZSBpbnN0YW5jZXMgdGhhdCBkbyBub3QKLQkgKiBleGlzdCBpbiB0aGUgbmV3ZXIgUHJvcGVydHlGaWxlIHlldCB0aGF0IGV4aXN0IGluIHRoZSBvbGRlcgotCSAqIFByb3BlcnR5RmlsZS4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldERlbGV0ZWQoKSB7Ci0JCXJldHVybiBfZGVsZXRlZDsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgb3V0IGFsbCBvZiB0aGUgY29sbGVjdGlvbnMgb2YgdmFyaWFibGUgc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFJlc3VsdHMoKSB7Ci0JCS8vIGNyZWF0ZSBhbiBvdXRwdXQgbG9nIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIGluIGl0IGxpc3QgdGhlIHN0cmluZ3MgaW4gYSBzZWN0aW9uIGVhY2guCi0JCWludCBudW1OZXcgPSBwcmludFN0cmluZ3MoIk5FVyBQUk9QRVJUSUVTIiwgX2FkZGVkKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaW50IG51bVdvcmRzRGVsZXRlZCA9IHByaW50U3RyaW5ncygiREVMRVRFRCBQUk9QRVJUSUVTIiwgX2RlbGV0ZWQpOyAvLyROT04tTkxTLTEkCi0JCWludCBudW1Xb3Jkc0NoYW5nZWQgPSAgcHJpbnRTdHJpbmdzKCJDSEFOR0VEIFBST1BFUlRJRVMiLCBfY2hhbmdlZC52YWx1ZXMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJZmxvYXQgdG90YWxDaGFuZ2UgPSBudW1OZXcgKyBudW1Xb3Jkc0RlbGV0ZWQgKyBudW1Xb3Jkc0NoYW5nZWQ7Ci0JCWZsb2F0IG51bVdvcmRzID0gX25ld0ZpbGUuZ2V0TnVtV29yZHMoKTsKLQkJZmxvYXQgcGVyY2VudCA9IHRvdGFsQ2hhbmdlIC8gbnVtV29yZHMgKiAxMDA7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJOdW1iZXIgb2YgbmV3IHdvcmRzOiAiICsgbnVtTmV3KTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiB3b3JkcyBpbiBkZWxldGVkIG1lc3NhZ2VzOiAiICsgbnVtV29yZHNEZWxldGVkKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiBjaGFuZ2VkIHdvcmRzIGluIG1vZGlmaWVkIG1lc3NhZ2VzOiAiICsgbnVtV29yZHNDaGFuZ2VkKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiB3b3JkcyBpbiBmaWxlICIgKyBfbmV3RmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpICsgIjogIiArIG51bVdvcmRzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgY2hhbmdlIG9mIHdvcmRzOiAiICsgdG90YWxDaGFuZ2UgKyAiLCB3aGljaCBpcyBhICIgKyBwZXJjZW50ICsgIiUgY2hhbmdlLiIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJpbnRSZXN1bHRzRm9yVHJhbnNsYXRpb24oKSB7Ci0JCS8vIGNyZWF0ZSBhbiBvdXRwdXQgbG9nIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIGluIGl0IGxpc3QgdGhlIHN0cmluZ3MgaW4gYSBzZWN0aW9uIGVhY2guCi0JCXByaW50U3RyaW5nc0ZvclRyYW5zbGF0aW9uKCJERUxFVEVEIFBST1BFUlRJRVMiLCBfZGVsZXRlZCk7IC8vJE5PTi1OTFMtMSQKLQkJcHJpbnRTdHJpbmdzRm9yVHJhbnNsYXRpb24oIk5FVyBQUk9QRVJUSUVTIiwgX2FkZGVkKTsgLy8kTk9OLU5MUy0xJAotCQlwcmludFN0cmluZ3NGb3JUcmFuc2xhdGlvbigiQ0hBTkdFRCBQUk9QRVJUSUVTIiwgX2NoYW5nZWQudmFsdWVzKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFByaW50IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBpbnQgcHJpbnRTdHJpbmdzKFN0cmluZyBoZWFkZXIsIENvbGxlY3Rpb24gbGluZXMpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihoZWFkZXIpOwotCQlpbnQgY291bnQgPSAwOwotCQlpbnQgbnVtV29yZHMgPSAwOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpbmVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBsaW5lID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYobGluZSBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJCW51bVdvcmRzICs9ICgoUHJvcGVydHlMaW5lKWxpbmUpLmdldE51bVdvcmRzKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBtdXN0IGJlIGEgY29tcGFyZSBsaW5lCi0JCQkJbnVtV29yZHMgKz0gKChDb21wYXJlTGluZSlsaW5lKS5nZXROdW1Xb3JkcygpOwotCQkJfQotCQkJCi0JCQljb3VudCsrOwotCQkJU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIHByb3BlcnRpZXM6ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCXJldHVybiBudW1Xb3JkczsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3J0ZWQgY29sbGVjdGlvbiBvZiBsaW5lcyBmcm9tIHRoZSAucHJvcGVydGllcyBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludFN0cmluZ3NGb3JUcmFuc2xhdGlvbihTdHJpbmcgaGVhZGVyLCBDb2xsZWN0aW9uIGxpbmVzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oaGVhZGVyKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5lcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQljb3VudCsrOwotCQkJT2JqZWN0IGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobGluZSBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJCVByb3BlcnR5TGluZSBwcm9wbGluZSA9IChQcm9wZXJ0eUxpbmUpIGxpbmU7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHByb3BsaW5lLmdldE1lc3NhZ2VJZCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpbmUgaW5zdGFuY2VvZiBDb21wYXJlTGluZSkgewotCQkJCUNvbXBhcmVMaW5lIHByb3BsaW5lID0gKENvbXBhcmVMaW5lKSBsaW5lOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wbGluZS5nZXRNZXNzYWdlSWQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImluc3RhbmNlIG9mICIgKyBsaW5lLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWw6ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvSVZhbGlkYXRpb25Db25zdGFudHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvSVZhbGlkYXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhZTllNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL0lWYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIHRoZSBtZXNzYWdlIGlkcyBvZiBhbGwgb2YgdGhlIFByb3BlcnRpZXMKLSAqIFZhbGlkYXRvcidzIG1lc3NhZ2VzLCBhbmQgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB0aGF0IAotICogY29udGFpbnMgdGhvc2UgbWVzc2FnZXMuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uQ29uc3RhbnRzIHsKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRU5BTUUgPSAicHJvcGVydGllc1ZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDAwID0gIkFCQ0QwMDAwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwMTBFID0gIkFCQ0QwMDEwRSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDEwVyA9ICJBQkNEMDAxMFciOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDAyMCA9ICJBQkNEMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDMwID0gIkFCQ0QwMDMwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwNDAgPSAiQUJDRDAwNDAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDA1MCA9ICJBQkNEMDA1MCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDYwID0gIkFCQ0QwMDYwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwNzAgPSAiQUJDRDAwNzAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDA4MCA9ICJBQkNEMDA4MCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDkwID0gIkFCQ0QwMDkwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAxMTAgPSAiQUJDRDAxMTAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDEyMCA9ICJBQkNEMDEyMCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMTMwID0gIkFCQ0QwMTMwIjsgLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0xPQyA9ICJMSU5FX0xPQyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvTWFpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDZlZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcGVyZm9ybSB2YWxpZGF0aW9uIG9yIC5wcm9wZXJ0aWVzIGZpbGUgcXVlcmllcwotICogd2l0aG91dCB1c2luZyBhbiBJVmFsaWRhdG9yLiAKLSAqLwotcHVibGljIGNsYXNzIE1haW4gewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLQkJaWYoYXJndi5sZW5ndGggPCAxKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInByb3AgLXRyIFstYSB8IC1hYyB8IC1hbSB8IC1hbiB8IC1hbCBQUkVGSVggfCAtYXAgUFJFRklYIHwgLWF1IHwgLWIgfCAtZGkgfCAtZHAgfCAtbCB8IC1sZSA8cG9zaXRpdmUgaW50ZWdlcj4gfCAtcCBdIGY6XFxkaXIxXFxkaXIyXFxteVByb3BlcnRpZXNGaWxlLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJvciAiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJwcm9wIFstY3wtY3RdIGY6XFxkaXIxXFxkaXIyXFxteVByb3BlcnRpZXNGaWxlLnByb3BlcnRpZXMgZjpcXGRpcjFcXGRpcjJcXG15TmV3UHJvcGVydGllc0ZpbGUucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1hOiBwcmludCBhbGwgZXJyb3Ivd2FybmluZy9pbmZvIHByZWZpeGVzIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtYWM6IHByaW50IGEgY291bnQgb2YgbWVzc2FnZXMgd2l0aCBhbmQgd2l0aG91dCBwcmVmaXhlcyBpbiB0aGUgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWFtOiBwcmludCBhbGwgbWVzc2FnZXMgd2l0aCBhIHByZWZpeCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWFuOiBwcmludCBhbGwgbWVzc2FnZXMgd2l0aG91dCBhbiBlcnJvciBwcmVmaXgiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIC1hbDogcHJpbnQgdGhlIGxhc3QgZXJyb3Ivd2FybmluZy9pbmZvIHByZWZpeCwgc3RhcnRpbmcgd2l0aCBQUkVGSVgsIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtYXA6IHByaW50IGFueSBlcnJvci93YXJuaW5nL2luZm8gcHJlZml4ZXMsIHN0YXJ0aW5nIHdpdGggUFJFRklYLCBpbiB0aGUgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWF1OiBwcmludCBhbGwgZXJyb3Ivd2FybmluZy9pbmZvIHByZWZpeGVzIHRoYXQgYXJlIG5vdCB1c2VkIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgLWI6IHByaW50IGFueSBibGFuayBtZXNzYWdlcyBpbiB0aGUgcHJvcGVydGllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgLWM6IGNvbXBhcmUgdGhlIHR3byBwcm9wZXJ0eSBmaWxlcyBsaXN0ZWQuIFRoZSBmaXJzdCBpcyB0aGUgb2xkZXIsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBuZXdlci4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIC1jdDogY29tcGFyZSB0aGUgdHdvIHByb3BlcnR5IGZpbGVzIGxpc3RlZC4gVGhlIGZpcnN0IGlzIHRoZSBvbGRlciwgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIG5ld2VyLiBPdXRwdXQgYSBsaXN0IG9mIHRoZSBhZGRlZCwgZGVsZXRlZCwgYW5kIGNoYW5nZWQgc3RyaW5ncywgYnV0IHByaW50IG9ubHkgdGhlIG1lc3NhZ2UgaWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtZGk6IHByaW50IGFueSBkdXBsaWNhdGUgbWVzc2FnZSBpZHMgYW5kIHN5bnRheCBlcnJvcnMgaW4gdGhlIHByb3BlcnRpZXMgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWRwOiBwcmludCBhbnkgZHVwbGljYXRlIGVycm9yL3dhcm5pbmcvaW5mbyBwcmVmaXhlcyBpbiB0aGUgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1sOiBwcmludCB0aGUgbGVuZ3RoIG9mIGVhY2ggbWVzc2FnZSBpbiB0aGUgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWxlOiBwcmludCB0aGUgbGVuZ3RoIG9mIGVhY2ggbWVzc2FnZSBpbiB0aGUgZmlsZSBpZiBlYWNoIHBhcmFtZXRlciBpcyA8cG9zaXRpdmUgaW50ZWdlcj4gY2hhcmFjdGVycyBsb25nLiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1uOiBwcmludCB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIHRoZSBmaWxlLCBpbmNsdWRpbmcgbWVzc2FnZSBwcmVmaXhlcyBhbmQgcGFyYW1ldGVycyIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1wOiBwcmludCB0aGUgY29udGVudHMgb2YgdGhlIHByb3BlcnR5IGZpbGUsIHNvcnRlZCBieSBtZXNzYWdlIGlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtdHI6IHByaW50IHRyYWNlIGluZm9ybWF0aW9uIHdoaWxlIHBhcnNpbmcgdGhlIC5wcm9wZXJ0aWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBkZWZhdWx0IGFjdGlvbiBpcyB0byBwcmludCB0aGUgc3ludGF4IGVycm9ycywgZHVwbGljYXRlcywgYW5kIG90aGVyIHR5cGVzIG9mIGVycm9ycyBpbiB0aGUgZ2l2ZW4gLnByb3BlcnRpZXMgZmlsZS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLmV4aXQoLTEpOwotCQl9Ci0KLQkJLy8gVGhpcyBpcyBub3Qgcm9idXN0IGVycm9yLWNoZWNraW5nIGJ5IGFueSBzdHJldGNoIG9mIHRoZSBpbWFnaW5hdGlvbiEKLQkJaW50IGluZGV4ID0gMDsKLQkJU3RyaW5nIG9wdGlvbiA9IGFyZ3ZbaW5kZXgrK10udG9Mb3dlckNhc2UoKTsKLQkJYm9vbGVhbiB0cmFjZSA9IGZhbHNlOwotCQlpZihvcHRpb24uZXF1YWxzKCItdHIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0cmFjZSA9IHRydWU7Ci0JCQlvcHRpb24gPSBhcmd2W2luZGV4KytdLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJCi0JCWlmIChvcHRpb24uZXF1YWxzKCItYSIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRBbGxFcnJvclByZWZpeCh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hYyIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRQcmVmaXhDb3VudCh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hbCIpICYmIChhcmd2Lmxlbmd0aCA+PSAzKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDIsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRFcnJvclByZWZpeCh0cmFjZSwgYXJndltpbmRleF0sIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItYW0iKSAmJiAoYXJndi5sZW5ndGggPj0gMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAxLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50RXJyb3JNZXNzYWdlcyh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hbiIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRNZXNzYWdlc1dpdGhvdXRQcmVmaXhlcyh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hcCIpICYmIChhcmd2Lmxlbmd0aCA+PSAzKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDIsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRFcnJvclByZWZpeFJhbmdlKHRyYWNlLCBhcmd2W2luZGV4XSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hdSIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRBbGxNaXNzaW5nRXJyb3JQcmVmaXgodHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItYiIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRCbGFua3ModHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItYyIpICYmIChhcmd2Lmxlbmd0aCA9PSAzKSkgeyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShhcmd2W2luZGV4KytdKTsKLQkJCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKGFyZ3ZbaW5kZXhdKTsKLQkJCWNvbXBhcmVGaWxlcyh0cmFjZSwgb2xkRmlsZSwgbmV3RmlsZSk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWN0IikgJiYgKGFyZ3YubGVuZ3RoID09IDMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKGFyZ3ZbaW5kZXgrK10pOwotCQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoYXJndltpbmRleF0pOwotCQkJY29tcGFyZUZpbGVzRm9yVHJhbnNsYXRpb24odHJhY2UsIG9sZEZpbGUsIG5ld0ZpbGUpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1kaSIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnREdXBsaWNhdGVJZHModHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItZHAiKSAmJiAoYXJndi5sZW5ndGggPj0gMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAxLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50RHVwbGljYXRlUHJlZml4ZXModHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbCIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRTdHJpbmdMZW5ndGgodHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbGUiKSAmJiAoYXJndi5sZW5ndGggPj0gMykpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTJdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAyLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50RXhwZWN0ZWRTdHJpbmdMZW5ndGgodHJhY2UsIGFyZ3ZbaW5kZXhdLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLW4iKSAmJiAoYXJndi5sZW5ndGggPj0gMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAxLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50V29yZENvdW50KHRyYWNlLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXAiKSAmJiAoYXJndi5sZW5ndGggPj0gMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAxLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50RmlsZUNvbnRlbnRzKHRyYWNlLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcmludERlZmF1bHQodHJhY2UsIGFyZ3YpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50QWxsRXJyb3JQcmVmaXgoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50QWxsTWVzc2FnZVByZWZpeGVzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRBbGxNaXNzaW5nRXJyb3JQcmVmaXgoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50QWxsTWlzc2luZ01lc3NhZ2VQcmVmaXhlcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50QmxhbmtzKGJvb2xlYW4gdHJhY2UsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludEFsbE1lc3NhZ2VzV2hpY2hBcmVCbGFuaygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50TWVzc2FnZXNXaXRob3V0UHJlZml4ZXMoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50QWxsTWVzc2FnZXNXaXRob3V0QU1lc3NhZ2VQcmVmaXgoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wYXJlRmlsZXMoYm9vbGVhbiB0cmFjZSwgRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUpIHsKLQkJaWYob2xkRmlsZS5pc0ZpbGUoKSAmJiBuZXdGaWxlLmlzRmlsZSgpKSB7Ci0JCQl0cnkgewotCQkJCVByb3BlcnR5RmlsZSBvbGRQcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUob2xkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJhY2UpOwotCQkJCVByb3BlcnR5RmlsZSBuZXdQcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUobmV3RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJhY2UpOwotCQkJCUNvbXBhcmVQcm9wZXJ0aWVzIGNwID0gbmV3IENvbXBhcmVQcm9wZXJ0aWVzKG9sZFByb3BGaWxlLCBuZXdQcm9wRmlsZSk7Ci0JCQkJY3AucHJpbnRSZXN1bHRzKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKG9sZEZpbGUuaXNEaXJlY3RvcnkoKSAmJiBuZXdGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIG9sZENoaWxkcmVuID0gb2xkRmlsZS5saXN0KCk7Ci0JCQlmb3IoaW50IGk9MDsgaTxvbGRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgbmV3Q2hpbGQgPSBuZXcgRmlsZShuZXdGaWxlLCBvbGRDaGlsZHJlbltpXSk7Ci0JCQkJaWYobmV3Q2hpbGQuZXhpc3RzKCkpIHsKLQkJCQkJLy8gRm91bmQgYSBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IGlzIG5hbWVkIHRoZSBzYW1lIGluIHRoZSBvbGQgJiBuZXcuIENvbXBhcmUuCi0JCQkJCWNvbXBhcmVGaWxlcyh0cmFjZSwgbmV3IEZpbGUob2xkRmlsZSwgb2xkQ2hpbGRyZW5baV0pLCBuZXdDaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21wYXJlIHR3byBmaWxlcyBvciB0d28gZGlyZWN0b3JpZXMuIERvIG5vdCBjb21wYXJlIGEgZmlsZSB0byBhIGRpcmVjdG9yeSAoIiArIG9sZEZpbGUuZ2V0TmFtZSgpICsgIiwgIiArIG5ld0ZpbGUuZ2V0TmFtZSgpICsgIikuIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbXBhcmVGaWxlc0ZvclRyYW5zbGF0aW9uKGJvb2xlYW4gdHJhY2UsIEZpbGUgb2xkRmlsZSwgRmlsZSBuZXdGaWxlKSB7Ci0JCWlmKG9sZEZpbGUuaXNGaWxlKCkgJiYgbmV3RmlsZS5pc0ZpbGUoKSkgewotCQkJdHJ5IHsKLQkJCQlQcm9wZXJ0eUZpbGUgb2xkUHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKG9sZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRyYWNlKTsKLQkJCQlQcm9wZXJ0eUZpbGUgbmV3UHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKG5ld0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRyYWNlKTsKLQkJCQlDb21wYXJlUHJvcGVydGllcyBjcCA9IG5ldyBDb21wYXJlUHJvcGVydGllcyhvbGRQcm9wRmlsZSwgbmV3UHJvcEZpbGUpOwotCQkJCWNwLnByaW50UmVzdWx0c0ZvclRyYW5zbGF0aW9uKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKG9sZEZpbGUuaXNEaXJlY3RvcnkoKSAmJiBuZXdGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIG9sZENoaWxkcmVuID0gb2xkRmlsZS5saXN0KCk7Ci0JCQlmb3IoaW50IGk9MDsgaTxvbGRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgbmV3Q2hpbGQgPSBuZXcgRmlsZShuZXdGaWxlLCBvbGRDaGlsZHJlbltpXSk7Ci0JCQkJaWYobmV3Q2hpbGQuZXhpc3RzKCkpIHsKLQkJCQkJLy8gRm91bmQgYSBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IGlzIG5hbWVkIHRoZSBzYW1lIGluIHRoZSBvbGQgJiBuZXcuIENvbXBhcmUuCi0JCQkJCWNvbXBhcmVGaWxlc0ZvclRyYW5zbGF0aW9uKHRyYWNlLCBuZXcgRmlsZShvbGRGaWxlLCBvbGRDaGlsZHJlbltpXSksIG5ld0NoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBhcmUgdHdvIGZpbGVzIG9yIHR3byBkaXJlY3Rvcmllcy4gRG8gbm90IGNvbXBhcmUgYSBmaWxlIHRvIGEgZGlyZWN0b3J5ICgiICsgb2xkRmlsZS5nZXROYW1lKCkgKyAiLCAiICsgbmV3RmlsZS5nZXROYW1lKCkgKyAiKS4iKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnREdXBsaWNhdGVJZHMoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50RHVwbGljYXRlTWVzc2FnZUlkKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFcnJvclByZWZpeChib29sZWFuIHRyYWNlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRMYXN0TWVzc2FnZVByZWZpeFN0YXJ0aW5nV2l0aChwcmVmaXgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50RXJyb3JQcmVmaXhSYW5nZShib29sZWFuIHRyYWNlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRNZXNzYWdlUHJlZml4U3RhcnRpbmdXaXRoKHByZWZpeCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnREdXBsaWNhdGVQcmVmaXhlcyhib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnREdXBsaWNhdGVNZXNzYWdlUHJlZml4KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRTdHJpbmdMZW5ndGgoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50U3RyaW5nTGVuZ3RoKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFeHBlY3RlZFN0cmluZ0xlbmd0aChib29sZWFuIHRyYWNlLCBTdHJpbmcgc2xlbmd0aCwgU3RyaW5nW10gZmlsZXMpIHsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCQotCQl0cnkgewotCQkJbGVuZ3RoID0gbmV3IEludGVnZXIoc2xlbmd0aCkuaW50VmFsdWUoKTsKLQkJfQotCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW1ldGVyIG11c3QgYmUgYW4gaW50ZWdlci4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludEV4cGVjdGVkU3RyaW5nTGVuZ3RoKGxlbmd0aCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFcnJvck1lc3NhZ2VzKGJvb2xlYW4gdHJhY2UsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludEFsbE1lc3NhZ2VzV2l0aEFNZXNzYWdlUHJlZml4KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRXb3JkQ291bnQoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wRmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpICsgIjo6IE51bWJlciBvZiB3b3JkcyA6OiAiICsgcHJvcEZpbGUuZ2V0TnVtV29yZHMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFByZWZpeENvdW50KGJvb2xlYW4gdHJhY2UsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzdWFsbHkgdGhlIG51bWJlciBvZiB1bmlxdWUgcHJlZml4ZXMgYW5kIHRoZSBudW1iZXIgb2YgcHJlZml4ZXMgaXMgdGhlIHNhbWUsIGJ1dCBpZiBhIC5wcm9wZXJ0aWVzIGZpbGUgaGFzIHZhcmlhdGlvbnMgb2YgYSBtZXNzYWdlIChzbGlnaHRseSBkaWZmZXJlbnQgd29yZGluZyBmb3IgYSBkaWZmZXJlbnQgY29udGV4dCksIHRoZW4gdGhlIG51bWJlciBvZiBwcmVmaXggbWVzc2FnZXMgd2lsbCBiZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwcmVmaXhlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wRmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpICsgIjo6IE51bWJlciBvZiB1bmlxdWUgcHJlZml4ZXMgOjogIiArIHByb3BGaWxlLmdldE51bVVuaXF1ZVByZWZpeGVzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKHByb3BGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCkgKyAiOjogTnVtYmVyIG9mIG1lc3NhZ2VzIHdpdGggcHJlZml4ZXMgOjogIiArIHByb3BGaWxlLmdldE51bVByZWZpeGVzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKHByb3BGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCkgKyAiOjogTnVtYmVyIG9mIG1lc3NhZ2VzIHdpdGhvdXQgcHJlZml4ZXMgOjogIiArIHByb3BGaWxlLmdldE51bVdpdGhvdXRQcmVmaXhlcygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEZpbGVDb250ZW50cyhib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRDb250ZW50cygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50RGVmYXVsdChib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCS8vIHByaW50IGFsbCBlcnJvcnMsIHdhcm5pbmdzLCBldGMuCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludFN5bnRheFdhcm5pbmdzKCk7Ci0JCQkJcHJvcEZpbGUucHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoKTsKLQkJCQlwcm9wRmlsZS5wcmludER1cGxpY2F0ZU1lc3NhZ2VQcmVmaXgoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChTdHJpbmdbXSBhcmd2KSB7Ci0JCWZvcihpbnQgaSA9MDtpPGFyZ3YubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpICsgIi4gIiArIGFyZ3ZbaV0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NZXNzYWdlTWV0YURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvTWVzc2FnZU1ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwN2U1NTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NZXNzYWdlTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIG1ldGFkYXRhIGZvciBhbiBJTWVzc2FnZSB0aGF0IG11c3QgYmUgCi0gKiByZXBvcnRlZCB0byB0aGUgdXNlciAoaS5lLiwgYSB2YWxpZGF0aW9uIGVycm9yLCB3YXJuaW5nLAotICogb3IgaW5mb3JtYXRpb24gbWVzc2FnZSkuIAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZU1ldGFEYXRhIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfVU5TRVQgPSAtMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IDM7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgX2J1bmRsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgaW50IF9zZXZlcml0eSA9IElOVF9VTlNFVDsKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZUlkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIF9wYXJtcyA9IG51bGw7Ci0JcHJpdmF0ZSBPYmplY3QgX3RhcmdldE9iamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgX2xpbmVOdW1iZXIgPSBJTlRfVU5TRVQ7Ci0JcHJpdmF0ZSBpbnQgX29mZnNldCA9IElOVF9VTlNFVDsKLQlwcml2YXRlIGludCBfbGVuZ3RoID0gSU5UX1VOU0VUOwotCXByaXZhdGUgU3RyaW5nIF90ZXh0ID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBtZXNzYWdlIHRleHQgaGFzIGFscmVhZHkKLQkgKiBiZWVuIHRyYW5zbGF0ZWQuCi0JICovCi0JcHVibGljIE1lc3NhZ2VNZXRhRGF0YShTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJX3RleHQgPSBtZXNzYWdlVGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCBpZiB0aGUgbWVzc2FnZSB0ZXh0IGlzIG5vdCB0cmFuc2xhdGVkCi0JICogdW50aWwganVzdCBiZWZvcmUgdGhlIHRleHQgc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSBpbiB3aGljaCB0aGUgbWVzc2FnZSBpcyBjb250YWluZWQKLQkgKiBAcGFyYW0gc2V2ZXJpdHkgLSBPbmUgb2YgdGhlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5TZXZlcml0eUVudW0gY29uc3RhbnRzOyB0aGlzIHBhcmFtZXRlciByZXByZXNlbnRzIHRoZSBzZXZlcml0eSBvZiB0aGUgSU1lc3NhZ2UuCi0JICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBtZXNzYWdlIGlkIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgYnVuZGxlLgotCSAqIEBwYXJhbSBwYXJtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIHN1YnN0aXR1dGVkIGludG8gdGhlIGphdmEudGV4dC5NZXNzYWdlVGV4dCdzIHBhdHRlcm5zLgotCSAqIEBwYXJhbSB0YXJnZXRPYmplY3QgLSBUaGUgdGFyZ2V0IG9iamVjdCBvZiB0aGUgSU1lc3NhZ2UgKHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUuSU1lc3NhZ2UpLgotCSAqIEBwYXJhbSBsaW5lTnVtYmVyIC0gVGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBwcm9ibGVtIGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgTWVzc2FnZU1ldGFEYXRhKFN0cmluZyBidW5kbGVOYW1lLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBpbnQgbGluZU51bWJlcikgewotCQl0aGlzKGJ1bmRsZU5hbWUsIHNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QsIGxpbmVOdW1iZXIsIElOVF9VTlNFVCwgSU5UX1VOU0VUKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCBpZiB0aGUgbWVzc2FnZSB0ZXh0IGlzIG5vdCB0cmFuc2xhdGVkCi0JICogdW50aWwganVzdCBiZWZvcmUgdGhlIHRleHQgc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSBpbiB3aGljaCB0aGUgbWVzc2FnZSBpcyBjb250YWluZWQKLQkgKiBAcGFyYW0gc2V2ZXJpdHkgLSBPbmUgb2YgdGhlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5TZXZlcml0eUVudW0gY29uc3RhbnRzOyB0aGlzIHBhcmFtZXRlciByZXByZXNlbnRzIHRoZSBzZXZlcml0eSBvZiB0aGUgSU1lc3NhZ2UuCi0JICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBtZXNzYWdlIGlkIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgYnVuZGxlLgotCSAqIEBwYXJhbSBwYXJtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIHN1YnN0aXR1dGVkIGludG8gdGhlIGphdmEudGV4dC5NZXNzYWdlVGV4dCdzIHBhdHRlcm5zLgotCSAqIEBwYXJhbSB0YXJnZXRPYmplY3QgLSBUaGUgdGFyZ2V0IG9iamVjdCBvZiB0aGUgSU1lc3NhZ2UgKHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUuSU1lc3NhZ2UpLgotCSAqIEBwYXJhbSBsaW5lTnVtYmVyIC0gVGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBwcm9ibGVtIGNhbiBiZSBmb3VuZC4KLQkgKiBAcGFyYW0gb2Zmc2V0IC0gSW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMsIGhvdyBtYW55IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIC5wcm9wZXJ0aWVzIGZpbGUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBwcm9ibGVtLgotCSAqIEBwYXJhbSBsZW5ndGggLSBJbiBudW1iZXIgb2YgY2hhcmFjdGVycywgaG93IG1hbnkgY2hhcmFjdGVycyBmcm9tIHRoZSBvZmZzZXQgdG8gdGhlIGVuZCBvZiB0aGUgcHJvYmxlbS4KLQkgKi8KLQlwdWJsaWMgTWVzc2FnZU1ldGFEYXRhKFN0cmluZyBidW5kbGVOYW1lLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlfYnVuZGxlTmFtZSA9IGJ1bmRsZU5hbWU7Ci0JCV9zZXZlcml0eSA9IHNldmVyaXR5OwotCQlfbWVzc2FnZUlkID0gbWVzc2FnZUlkOwotCQlfcGFybXMgPSBwYXJtczsKLQkJX3RhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDsKLQkJX2xpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotCQlfb2Zmc2V0ID0gb2Zmc2V0OwotCQlfbGVuZ3RoID0gbGVuZ3RoOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiBfYnVuZGxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIF9zZXZlcml0eTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbXMoKSB7Ci0JCXJldHVybiBfcGFybXM7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gX3RhcmdldE9iamVjdDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gX2xpbmVOdW1iZXI7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gX29mZnNldDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIF9sZW5ndGg7Ci0JfQotCQotCS8qKgotCSAqIFVzZSB0aGUgZ2l2ZW4gQ2xhc3NMb2FkZXIgdG8gbG9hZCB0aGlzIG1lc3NhZ2UncyB0ZXh0Ci0JICogZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlpZihfdGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VGV4dChMb2NhbGUuZ2V0RGVmYXVsdCgpLCBjbGFzc0xvYWRlcik7Ci0JCX0KLQkJcmV0dXJuIF90ZXh0OwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGUgZ2l2ZW4gQ2xhc3NMb2FkZXIgdG8gbG9hZCB0aGlzIG1lc3NhZ2UncyB0ZXh0LAotCSAqIGZvciB0aGUgTG9jYWxlLCBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICovCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbG9jYWxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlpZihfdGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VGV4dChnZXRCdW5kbGVOYW1lKCksIGxvY2FsZSwgY2xhc3NMb2FkZXIsIGdldElkKCksIGdldFBhcmFtcygpKTsKLQkJfQotCQkKLQkJcmV0dXJuIF90ZXh0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0ZWQgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHRvIHNlYXJjaCBmb3IgdGhlIG1lc3NhZ2UuCi0JICogQHBhcmFtIGxvY2FsZSBUaGUgTG9jYWxlIGZvciB3aGljaCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgbG9hZGVkLgotCSAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgQ2xhc3NMb2FkZXIgd2hpY2ggY2FuIGxvY2F0ZSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIEBwYXJhbSBtZXNzYWdlSWQgVGhlIHVuaXF1ZSBpZCwgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSwgdGhhdCBpZGVudGlmaWVzIHRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBwYXJtcyBUaGUgcGFyYW1ldGVycyB0byBzdWJzdGl0dXRlIGludG8gdGhlIHBhdHRlcm4gb2YgdGhlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHQoU3RyaW5nIGJ1bmRsZU5hbWUsIExvY2FsZSBsb2NhbGUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcykgewotCQlTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZShidW5kbGVOYW1lLCBsb2NhbGUsIGNsYXNzTG9hZGVyKTsKLQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQltZXNzYWdlID0gYnVuZGxlLmdldFN0cmluZyhtZXNzYWdlSWQpOwotCi0JCQlpZiAocGFybXMgIT0gbnVsbCkgewotCQkJCW1lc3NhZ2UgPSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgcGFybXMpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXhjKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZXhjLmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZUlkKTsKLQkJfQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZXhjLmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZUlkKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlcywgYXMgaWRlbnRpZmllZCBieQotCSAqIEBsaW5rICNnZXRCdW5kbGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgYnVuZGxlTmFtZSwgTG9jYWxlIGxvY2FsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChjbGFzc0xvYWRlciA9PSBudWxsKSB7Ci0JCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGxvY2FsZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgbG9jYWxlLCBjbGFzc0xvYWRlcik7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfQotCQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Byb3BlcnR5RmlsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2MGIxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Byb3BlcnR5RmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlcjsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogVGhpcyBQcm9wZXJ0eUZpbGUgaXMgaW5zdGFudGlhdGVkIGJ5IGNvZGUgdGhhdCBpc24ndCBhbiBJVmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlGaWxlIGV4dGVuZHMgQVByb3BlcnR5RmlsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX2VuY2xvc2luZ1ppcEZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcHJvcGVydHlGaWxlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX2ZpbGVOYW1lID0gbnVsbDsKLQkKLQlwdWJsaWMgUHJvcGVydHlGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl0aGlzKGZpbGVOYW1lLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFByb3BlcnR5RmlsZShTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gdHJhY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJdGhpcyhuZXcgRmlsZShmaWxlTmFtZSksIHRyYWNlKTsKLQl9Ci0JCi0JcHVibGljIFByb3BlcnR5RmlsZShGaWxlIHByb3BlcnR5RmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl0aGlzKHByb3BlcnR5RmlsZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgUHJvcGVydHlGaWxlKEZpbGUgcHJvcGVydHlGaWxlLCBib29sZWFuIHRyYWNlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXRoaXMobnVsbCwgcHJvcGVydHlGaWxlLCB0cmFjZSk7Ci0JfQotCQotCXB1YmxpYyBQcm9wZXJ0eUZpbGUoU3RyaW5nIGVuY2xvc2luZ1ppcEZpbGVOYW1lLCBGaWxlIHByb3BlcnR5RmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl0aGlzKGVuY2xvc2luZ1ppcEZpbGVOYW1lLCBwcm9wZXJ0eUZpbGUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHlGaWxlKFN0cmluZyBlbmNsb3NpbmdaaXBGaWxlTmFtZSwgRmlsZSBwcm9wZXJ0eUZpbGUsIGJvb2xlYW4gZGVidWcpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJaWYgKCFwcm9wZXJ0eUZpbGUuZXhpc3RzKCkpCi0JCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigiQ2Fubm90IGZpbmQgZmlsZSAiICsgcHJvcGVydHlGaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFwcm9wZXJ0eUZpbGUuaXNGaWxlKCkpCi0JCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihwcm9wZXJ0eUZpbGUuZ2V0TmFtZSgpICsgIiBpcyBub3QgYSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFwcm9wZXJ0eUZpbGUuY2FuUmVhZCgpKQotCQkJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oIkNhbm5vdCByZWFkICIgKyBwcm9wZXJ0eUZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXByb3BlcnR5RmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoInByb3BlcnRpZXMiKSkgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oIkNhbiBwYXJzZSBvbmx5IC5wcm9wZXJ0aWVzIGZpbGVzOyBpZ25vcmluZyAiICsgcHJvcGVydHlGaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlzZXREZWJ1ZyhkZWJ1Zyk7Ci0JCQkKLQkJX2VuY2xvc2luZ1ppcEZpbGVOYW1lID0gZW5jbG9zaW5nWmlwRmlsZU5hbWU7Ci0JCQotCQlfZmlsZU5hbWUgPSBwcm9wZXJ0eUZpbGUuZ2V0TmFtZSgpOwotCQkKLQkJcmVwb3J0KCJGaWxlIG5hbWU6ICIgKyBfZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlRmlsZShwcm9wZXJ0eUZpbGUpOwotCQlyZXBvcnQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJcHJvcGVydHlGaWxlID0gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEFQcm9wZXJ0eUZpbGUjcmVwb3J0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoU3RyaW5nIHN0cikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEFQcm9wZXJ0eUZpbGUjcmVwb3J0KE1lc3NhZ2VNZXRhRGF0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoTWVzc2FnZU1ldGFEYXRhIG1lc3NhZ2UpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobWVzc2FnZS5nZXRUZXh0KGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotCQlidWZmZXIuYXBwZW5kKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIElWYWxpZGF0aW9uQ29uc3RhbnRzLkxJTkVfTE9DLCBuZXcgU3RyaW5nW117U3RyaW5nLnZhbHVlT2YobWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkpLCBnZXRRdWFsaWZpZWRGaWxlTmFtZSgpfSkpOwotCQlyZXBvcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZEZpbGVOYW1lKCkgewotCQlpZiAoX3Byb3BlcnR5RmlsZU5hbWUgPT0gbnVsbCkgewotCQkJaWYgKF9lbmNsb3NpbmdaaXBGaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQkJX3Byb3BlcnR5RmlsZU5hbWUgPSBfZmlsZU5hbWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlfcHJvcGVydHlGaWxlTmFtZSA9IF9lbmNsb3NpbmdaaXBGaWxlTmFtZSArICI6OiIgKyBfZmlsZU5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gX3Byb3BlcnR5RmlsZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9maWxlTmFtZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvUHJvcGVydHlMaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjljN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogUHJvcGVydHlMaW5lIHJlcHJlc2VudHMgYSBsaW5lIGluIGEgUHJvcGVydHlGaWxlLiBJdCBoYXMgYSBtZXNzYWdlIGlkLAotICogYSBtZXNzYWdlIHZhbHVlICh0aGUgdGV4dCBvZiB0aGUgcHJvcGVydHk7IHRoaXMgaXMgdGhlIHRleHQgd2hpY2ggaXMKLSAqIHRyYW5zbGF0ZWQpLCBhIGxpbmUgbnVtYmVyLCBhbmQsIG9wdGlvbmFsbHksIGFuIHVuaXF1ZSBlcnJvciBpZCAob2YgdGhlCi0gKiBmb3JtIEFCQ0QxMjM0e0V8V3xJfSkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUxpbmUgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZUlkOyAvLyB0aGUgbWVzc2FnZSBpZCAobm90IHRyYW5zbGF0ZWQpCi0JcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOyAvLyB0aGUgbWVzc2FnZSB2YWx1ZSB3aXRoIHRoZSBlcnJvciBpZCAodHJhbnNsYXRlZCkKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZVByZWZpeCA9IG51bGw7IC8vIHRoZSBwcmVmaXggKGUuZy4gQUJDRDEyMzR7RXxXfEl9Ci0JcHJpdmF0ZSBTdHJpbmcgX3Nob3J0TWVzc2FnZSA9IG51bGw7IC8vIHRoZSBtZXNzYWdlIHZhbHVlIHdpdGhvdXQgdGhlIGVycm9yIGlkICh0cmFuc2xhdGVkKQotCXByaXZhdGUgaW50IF9saW5lTnVtYmVyID0gLTE7IC8vIHRoZSBsaW5lIG51bWJlciBvZiB0aGlzIG1lc3NhZ2UgdmFsdWUKLQlwcml2YXRlIGludCBfbnVtV29yZHMgPSAtMTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBBUHJvcGVydHlGaWxlIF9maWxlID0gbnVsbDsKLQlwcml2YXRlIGludCBfb2Zmc2V0ID0gLTE7IC8vIHRoZSBvZmZzZXQsIGluIHRoZSAucHJvcGVydGllcyBmaWxlLCB3aGVyZSB0aGlzIGxpbmUgYmVnaW5zCi0JcHJpdmF0ZSBpbnQgX21lc3NhZ2VPZmZzZXQgPSAtMTsgIC8vIHRoZSBvZmZzZXQgaW4gdGhlIGxpbmUsIGFmdGVyIHRoZSBFUVVBTFMsIHdoZXJlIHRoZSBtZXNzYWdlIHByZWZpeCBiZWdpbnMKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFFVT1RFID0gJ1wnJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE9CUkFDS0VUID0gJ3snOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ0JSQUNLRVQgPSAnfSc7Ci0KLQkvLyBUaGUgRW51bSBmb3IgdGhlIG1lc3NhZ2Ugc2V2ZXJpdHkgY2FuIGJlIG9uZSBvZiB0aGVzZSBmb3VyIHZhbHVlcy4gSWYgdGhlcmUgaXMgYW4gZXJyb3IgaWQsCi0JLy8gVU5BU1NJR05FRCBpbmRpY2F0ZXMgYW4gaW52YWxpZCB2YWx1ZS4gCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVU5BU1NJR05FRCA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVJST1IgPSAweDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV0FSTklORyA9IDB4MjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTkZPID0gMHgzOwotCi0JcHJpdmF0ZSBpbnQgX3NldmVyaXR5ID0gVU5BU1NJR05FRDsgLy8gdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLCBpZiB0aGlzIG1lc3NhZ2UgaGFzIGFuIGVycm9yIGlkLiBVTkFTU0lHTkVEIG1lYW5zIGVpdGhlciB0aGF0IHRoZSBzZXZlcml0eSB3YXMgYW4gaW52YWxpZCBzZXZlcml0eSAobm90IGluZm8sIHdhcm4sIG9yIGVycm9yKSwgb3IgdGhhdCB0aGUgbWVzc2FnZSBoYXMgbm8gZXJyb3IgaWQuIENoZWNrIHRoZSB2YWx1ZSBvZiB0aGUgZXJyb3IgaWQgdG8gZmluZCBvdXQgd2hpY2ggb2YgdGhlIHR3byBpcyB0aGUgY2FzZS4KLQlwcml2YXRlIGludCBfbnVtUGFybXMgPSAwOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCTEFOSyA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi50b0NoYXJBcnJheSgpOyAvLyB0aGlzIHN0cmluZyBpcyAxMDAgY2hhcmFjdGVycyBsb25nLiBJdCdzIHVzZWQgdG8gcXVpY2tseSBnZXQgYSBibGFuayBzdHJpbmcgaW4gdGhlIGdldEJsYW5rKGludCkgbWV0aG9kLiBIb3BlZnVsbHkgdGhlIHVzZXIgd2lsbCBuZXZlciB3YW50IG1vcmUgdGhhbiAxMDAgY2hhciBpbiBhIGdpdmVuIHBhcmFtZXRlci4gLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFByb3BlcnR5TGluZShBUHJvcGVydHlGaWxlIGZpbGUsIGludCBvZmZzZXQsIGludCBtZXNzYWdlT2Zmc2V0LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIpIHsKLQkJLy8gQ29tbWVudCBvbiB0aGUgdXNlIG9mIGludGVybigpLgotCQkvLyBCZWNhdXNlIGl0J3MgbGlrZWx5IHRoYXQgd2UnbGwgYmUgY29tcGFyaW5nIHRoaXMgc3RyaW5nIGEgbG90LAotCQkvLyBsb2FkIGl0IGludG8gdGhlIEphdmEgY29uc3RhbnRzIHNwYWNlIHRocm91Z2ggaW50ZXJuKCkuIFNpbmNlIHdlIHdvbid0Ci0JCS8vIGJlIG1vZGlmeWluZyB0aGlzIHN0cmluZywgaXQncyBzYWZlIHRvIGxvYWQgaXQgaW50byB0aGUgY29uc3RhbnRzIHNwYWNlLgotCQkvLwotCQlfb2Zmc2V0ID0gb2Zmc2V0OyAvLyB0aGUgb2Zmc2V0IGluIHRoZSAucHJvcGVydGllcyBmaWxlIHdoZXJlIHRoaXMgbGluZSBiZWdpbnMKLQkJX21lc3NhZ2VPZmZzZXQgPSBtZXNzYWdlT2Zmc2V0OyAvLyB0aGUgb2Zmc2V0IGluIHRoZSBsaW5lLCBhZnRlciB0aGUgRVFVQUxTLCB3aGVyZSB0aGUgbWVzc2FnZSBwcmVmaXggYmVnaW5zCi0JCV9tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7Ci0JCV9tZXNzYWdlID0gbWVzc2FnZTsgLy8gcmU6IGludGVybigpLiBEaXR0by4KLQkJX2xpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotCQlfZmlsZSA9IGZpbGU7Ci0KLQkJcGFyc2UobWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJLy8gYnkgZGVmYXVsdCwgc29ydCBieSBtZXNzYWdlIGlkCi0JCWlmICghKG8gaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpKSB7Ci0JCQkvLyB0aGVuIGhvdyBvbiBlYXJ0aCBkaWQgdGhpcyBtZXRob2QgZ2V0IGNhbGxlZD8/Ci0JCQkvLyBwdXQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0TWVzc2FnZUlkKCkuY29tcGFyZVRvKCgoUHJvcGVydHlMaW5lKSBvKS5nZXRNZXNzYWdlSWQoKSk7Ci0JfQotCi0JcHVibGljIEFQcm9wZXJ0eUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIF9maWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVByZWZpeCgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlUHJlZml4OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNNZXNzYWdlUHJlZml4KCkgewotCQlpZihfbWVzc2FnZVByZWZpeCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKF9tZXNzYWdlUHJlZml4LmVxdWFscyhFTVBUWSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIF9saW5lTnVtYmVyOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBfbWVzc2FnZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWQoKSB7Ci0JCXJldHVybiBfbWVzc2FnZUlkOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIF9zaG9ydE1lc3NhZ2U7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiB3b3JkcyBpbiB0aGUgbWVzc2FnZSBleGNsdWRpbmcgCi0JICogdGhlIG1lc3NhZ2UgZXJyb3IgaWQgcHJlZml4LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtV29yZHMoKSB7Ci0JCWlmKF9udW1Xb3JkcyA9PSAtMSkgewotCQkJX251bVdvcmRzID0gMDsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdldFNob3J0TWVzc2FnZSgpKTsKLQkJCV9udW1Xb3JkcyA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQl9Ci0JCXJldHVybiBfbnVtV29yZHM7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSAKLQkgKiBtZXNzYWdlIGluY2x1ZGluZyB0aGUgbWVzc2FnZSBwcmVmaXggYW5kIHBhcmFtZXRlcnMuIChpLmUuLCB7MH0gd291bGQKLQkgKiBiZSBjb3VudGVkIGFzIHRocmVlIGNoYXJhY3RlcnMuKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TWVzc2FnZSgpLmxlbmd0aCgpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgCi0JICogbWVzc2FnZSBpbmNsdWRpbmcgdGhlIG1lc3NhZ2UgcHJlZml4IGFuZCB0aGUgZXhwZWN0ZWQgCi0JICogbnVtYmVyIG9mIGNoYXJhY3RlcnMuIChUaGF0IGlzLCB0aGUgbGVuZ3RoUGFybSBwYXJhbWV0ZXIKLQkgKiBpcyB1c2VkIGFzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGxlbmd0aCBvZiBlYWNoIHBhcmFtZXRlcgotCSAqIGluIHRoZSBtZXNzYWdlLikKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4cGVjdGVkTGVuZ3RoKGludCBsZW5ndGhQYXJtKSB7Ci0JCWlmKGhhc1BhcmFtZXRlcnMoKSAmJiAobGVuZ3RoUGFybSA+IDApKSB7Ci0JCQlyZXR1cm4gZ2V0RXhwZWN0ZWRNZXNzYWdlKGxlbmd0aFBhcm0pLmxlbmd0aCgpOwotCQl9Ci0JCXJldHVybiBnZXRMZW5ndGgoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc3Vic3RpdHV0ZXMgYSBibGFuayBzdHViIG9mIHRoZSBnaXZlbiBsZW5ndGgKLQkgKiBldmVyeSBwbGFjZSBpbiB0aGUgc3RyaW5nIHdoZXJlIHRoZXJlIGlzIGEgcGFybS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4cGVjdGVkTWVzc2FnZShpbnQgbGVuZ3RoUGFybSkgewotCQlpZihoYXNQYXJhbWV0ZXJzKCkgJiYgKGxlbmd0aFBhcm0gPiAwKSkgewotCQkJLy8gbWVzc2FnZSBjYW5ub3QgYmUgbnVsbCBvciBibGFuayBvciBpdCB3b3VsZG4ndCBoYXZlIHBhcmFtZXRlcnMKLQkJCVN0cmluZyBibGFuayA9IGdldEJsYW5rKGxlbmd0aFBhcm0pOwotCQkJCi0JCQlpbnQgbnVtUGFybSA9IGdldE51bVBhcmFtZXRlcnMoKTsKLQkJCVN0cmluZ1tdIHBhcm0gPSBuZXcgU3RyaW5nW251bVBhcm1dOwotCQkJZm9yKGludCBpPTA7IGk8cGFybS5sZW5ndGg7IGkrKykgewotCQkJCXBhcm1baV0gPSBibGFuazsKLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2UoKSwgcGFybSk7Ci0JCQl9Ci0JCQljYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJaWYoZ2V0RmlsZSgpLmRlYnVnKCkpIHsKLQkJCQkJZ2V0RmlsZSgpLnJlcG9ydChleGMuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJZ2V0RmlsZSgpLnJlcG9ydChnZXRGaWxlKCkuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKSArICI6OiIgKyBnZXRNZXNzYWdlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0TWVzc2FnZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBibGFuayBzdHJpbmcgb2YgdGhlIGdpdmVuIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCbGFuayhpbnQgbGVuZ3RoKSB7Ci0JCWNoYXJbXSBibGFuayA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWlmKGxlbmd0aCA+IEJMQU5LLmxlbmd0aCkgewotCQkJZm9yKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLQkJCQlibGFua1tpXSA9ICcgJzsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoQkxBTkssIDAsIGJsYW5rLCAwLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGJsYW5rKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGluZSBoYXMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgcGF0dGVybnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIGdldE51bVBhcmFtZXRlcnMoKSA+IDA7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IHBhdHRlcm5zIGluIHRoZSBwcm9wZXJ0eSBsaW5lLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIF9udW1QYXJtczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycywgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIHRvCi0JICogdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1lc3NhZ2VPZmZzZXQoKSB7Ci0JCXJldHVybiBfbWVzc2FnZU9mZnNldDsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIG9mZnNldCwgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUsIHdoZXJlIHRoaXMgbGluZSBiZWdpbnMuCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBfb2Zmc2V0OwotCX0KLQkKLQkvKioKLQkgKiBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UsIGlmIHRoaXMgbWVzc2FnZSBoYXMgYW4gZXJyb3IgaWQuIAotCSAqIFVOQVNTSUdORUQgbWVhbnMgZWl0aGVyIHRoYXQgdGhlIHNldmVyaXR5IHdhcyBhbiBpbnZhbGlkIHNldmVyaXR5IAotCSAqIChub3QgaW5mbywgd2Fybiwgb3IgZXJyb3IpLCBvciB0aGF0IHRoZSBtZXNzYWdlIGhhcyBubyBlcnJvciBpZC4gQ2hlY2sgCi0JICogdGhlIHZhbHVlIG9mIHRoZSBlcnJvciBpZCB0byBmaW5kIG91dCB3aGljaCBvZiB0aGUgdHdvIGlzIHRoZSBjYXNlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBfc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JKiBQYXJzZSB0aGUgbWVzc2FnZSB2YWx1ZSB0byBleHRyYWN0IHRoZSB1bmlxdWUgZXJyb3IgaWQsIGlmIGFueSBleGlzdHMuCi0JKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBzb21lIG9mIHRoZSBmaWVsZHMgaW4gdGhpcyBjbGFzcy4KLQkqLwotCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCS8vIFRvIHNlZSB3aHkgaXQncyBzYWZlIHRvIGNhbGwgaW50ZXJuKCksIHJlYWQgdGhlIGNvbW1lbnQgaW4gdGhlCi0JCS8vIGNvbnN0cnVjdG9yLgotCi0JCS8vIENhc2UgMTogQUJDRDAwMDBFOiBCbGFoIEJsYWggQmxhaAotCQkvLyBDYXNlIDI6IEFCQ0QwMDAwRSAgQmxhaCBCbGFoIEJsYWgKLQkJLy8gQ2FzZSAzOiBBQkNEMDAwMEUgOiBCbGFoIEJsYWggQmxhaAotCQkvLyBDYXNlIDQ6IEFCQ0QwMDAwRSAgQmxhaDpCbGFoIEJsYWgKLQkJLy8gQ2FzZSA1OiBBQkNEMDAwMEUgOgotCQkvLyBDYXNlIDY6IEJsYWggQmxhaCBCbGFoIChpLmUuLCBubyBwcmVmaXgpCi0JCS8vIENhc2UgNzogQUJDRDAwMDBFOiBCbGFoCi0JCS8vIENhc2UgODogQUJDRDAwMDBFICBCbGFoCi0JCS8vIENhc2UgOTogQUJDRDAwMDBFIDogQmxhaAotCQkvLyBDYXNlIDEwOiBBQkNEMDAwMEUgQmxhaAotCQkvLyBDYXNlIDExOiBBQkNEMDAwMEUKLQotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlfbWVzc2FnZVByZWZpeCA9IEVNUFRZOwotCQkJX3Nob3J0TWVzc2FnZSA9IEVNUFRZOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWVzc2FnZSk7Ci0JCWludCBudW1Ub2tlbnMgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJaWYgKG51bVRva2VucyA9PSAwKSB7Ci0JCQlfbWVzc2FnZVByZWZpeCA9IEVNUFRZOwotCQkJX3Nob3J0TWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JJZCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWJvb2xlYW4gcHJlZml4RXhpc3RzID0gZmFsc2U7Ci0KLQkJCS8vIFNvbWV0aW1lcyB0aGUgJzonIGlzbid0IHRoZXJlIG9yIGlzbid0IGluIHRoZSByaWdodCBwbGFjZSwgc28gZG9uJ3QgZGV0ZXJtaW5lIHRoZSBtZXNzYWdlIHByZWZpeCBiYXNlZCBvbiB0aGF0LgotCQkJU3RyaW5nIGFmdGVyUHJlZml4ID0gbnVsbDsKLQkJCWlmKGVycm9ySWQubGVuZ3RoKCkgPj0gOSkgewotCQkJCWFmdGVyUHJlZml4ID0gZXJyb3JJZC5zdWJzdHJpbmcoMCwgOSk7IC8vIE11c3QgYmUgb2YgdGhlIGZvcm0gQUJDRDEyMzRFLCB3aGljaCBpcyA5IGNoYXIgbG9uZwotCQkJCWNoYXJbXSB0ZW1wID0gYWZ0ZXJQcmVmaXgudG9DaGFyQXJyYXkoKTsKLQkJCQlwcmVmaXhFeGlzdHMgPSBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFswXSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFsxXSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFsyXSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFszXSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzRdKTsKLQkJCQlwcmVmaXhFeGlzdHMgPSBwcmVmaXhFeGlzdHMgJiYgQ2hhcmFjdGVyLmlzRGlnaXQodGVtcFs1XSk7Ci0JCQkJcHJlZml4RXhpc3RzID0gcHJlZml4RXhpc3RzICYmIENoYXJhY3Rlci5pc0RpZ2l0KHRlbXBbNl0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzddKTsKLQkJCQlwcmVmaXhFeGlzdHMgPSBwcmVmaXhFeGlzdHMgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyKHRlbXBbOF0pICYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZSh0ZW1wWzBdKTsKLQotCQkJCWlmIChwcmVmaXhFeGlzdHMpIHsKLQkJCQkJc3dpdGNoICh0ZW1wWzhdKSB7Ci0JCQkJCQljYXNlICgnRScpIDoKLQkJCQkJCQl7Ci0JCQkJCQkJCV9zZXZlcml0eSA9IEVSUk9SOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQljYXNlICgnVycpIDoKLQkJCQkJCQl7Ci0JCQkJCQkJCV9zZXZlcml0eSA9IFdBUk5JTkc7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCWNhc2UgKCdJJykgOgotCQkJCQkJCXsKLQkJCQkJCQkJX3NldmVyaXR5ID0gSU5GTzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJewotCQkJCQkJCQlfc2V2ZXJpdHkgPSBVTkFTU0lHTkVEOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCX0KLQkJCQkJX21lc3NhZ2VQcmVmaXggPSBhZnRlclByZWZpeDsKLQkJCQkJCi0JCQkJCWludCBjb2xvbkluZGV4ID0gZXJyb3JJZC5pbmRleE9mKCc6Jyk7Ci0JCQkJCWJvb2xlYW4gbm9Db2xvbiA9IChjb2xvbkluZGV4ID09IC0xKTsKLQkKLQkJCQkJaW50IHNob3J0TWVzc2FnZUluZGV4ID0gMTA7IC8vIGFzc3VtZSB0aGF0IG9ubHkgdGhlIEFCQ0QwMDAwRSBwcmVmaXggd2lsbCBiZSBzdHJpcHBlZCAoaS5lLiwgbm8gY29sb24pCi0JCQkJCWlmKG5vQ29sb24pIHsKLQkJCQkJCS8vIE5vIGNvbG9uIGZvbGxvd2luZyBtZXNzYWdlIHByZWZpeCBpbW1lZGlhdGVseS4KLQkJCQkJCS8vIElzIHRoZXJlIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBjb2xvbj8KLQkJCQkJCWlmIChudW1Ub2tlbnMgPiAxKSB7Ci0JCQkJCQkJU3RyaW5nIG5leHRUb2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCQljb2xvbkluZGV4ID0gbmV4dFRva2VuLmluZGV4T2YoJzonKTsKLQkJCQkJCQlub0NvbG9uID0gKChjb2xvbkluZGV4ID09IC0xKSB8fCAobmV4dFRva2VuLnRyaW0oKS5pbmRleE9mKCc6JykgIT0gMCkpOyAvLyBjYXNlIDQgdHJpbSBjb25kaXRpb24gd2lsbCBiZSB0cnVlCi0JCQkJCQkJCi0JCQkJCQkJLy8gIjoiIHNob3VsZCBmb2xsb3cgdGhlIG1lc3NhZ2UgcHJlZml4IGltbWVkaWF0ZWx5Ci0JCQkJCQkJLy8gS25vdyB0aGVyZSdzIGEgcHJlZml4LCBhbmQgdGhhdCdzIDkgY2hhcgotCQkJCQkJCWlmKG5vQ29sb24pIHsKLQkJCQkJCQkJLy8gQ2FzZSAyLCA0LCA4IG9yIDEwCi0vLwkJCQkJCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLklORk8sIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMTIwLCBuZXcgU3RyaW5nW117fSwgdGhpcywgZ2V0TGluZU51bWJlcigpKTsKLS8vCQkJCQkJCQlnZXRGaWxlKCkuYWRkUGFyc2VXYXJuaW5nKG1tZCk7Ci0JCQkJCQkJCXNob3J0TWVzc2FnZUluZGV4ID0gMTA7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotLy8JCQkJCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5JTkZPLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDEzMCwgbmV3IFN0cmluZ1tde30sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0vLwkJCQkJCQkJZ2V0RmlsZSgpLmFkZFBhcnNlV2FybmluZyhtbWQpOwotCQkJCQkJCQkKLQkJCQkJCQkJaWYobnVtVG9rZW5zID4gMikgewotCQkJCQkJCQkJLy8gQ2FzZSAzIG9yIDkKLQkJCQkJCQkJCW5leHRUb2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJCXNob3J0TWVzc2FnZUluZGV4ID0gbWVzc2FnZS5pbmRleE9mKG5leHRUb2tlbik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkvLyBDYXNlIDUKLQkJCQkJCQkJCXNob3J0TWVzc2FnZUluZGV4ID0gY29sb25JbmRleCArIDE7Ci0JCQkJCQkJCX0JCQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCQlfc2hvcnRNZXNzYWdlID0gbWVzc2FnZS5zdWJzdHJpbmcoc2hvcnRNZXNzYWdlSW5kZXgsIG1lc3NhZ2UubGVuZ3RoKCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gQ2FzZSAxMQotCQkJCQkJCV9zaG9ydE1lc3NhZ2UgPSBFTVBUWTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIENhc2UgMSBvciA3Ci0JCQkJCQlzaG9ydE1lc3NhZ2VJbmRleCA9IGNvbG9uSW5kZXggKyAxOwotCQkJCQkJX3Nob3J0TWVzc2FnZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKHNob3J0TWVzc2FnZUluZGV4LCBtZXNzYWdlLmxlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkKLQkJCX0KLQotCQkJaWYgKCFwcmVmaXhFeGlzdHMpIHsKLQkJCQkvLyBDYXNlIDYKLQkJCQlfbWVzc2FnZVByZWZpeCA9IEVNUFRZOwotCQkJCV9zaG9ydE1lc3NhZ2UgPSBtZXNzYWdlOwotCQkJfQotCQl9Ci0KLQkJZ2V0RmlsZSgpLmFkZFBhcnNlV2FybmluZ3MocGFyc2VNZXNzYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIE9uY2UgdGhlIGZpZWxkIHRoYXQgaG9sZHMgdGhlIG1lc3NhZ2UgdGV4dCBoYXMgYmVlbiBzZXQgKGkuZS4sIHBhcnNlKFN0cmluZykKLQkgKiBoYXMgYmVlbiBjYWxsZWQpLCB0aGlzIG1ldGhvZCBwYXJzZXMgdGhlIG1lc3NhZ2UgdGV4dCwgZmluZHMgYW55IHN5bnRheCBvcgotCSAqIG90aGVyIHByb2JsZW1zLCBhbmQgcmV0dXJucyBhIExpc3Qgb2YgTWVzc2FnZU1ldGFEYXRhLCB3aXRoIG9uZSBNZXNzYWdlTWV0YURhdGEKLQkgKiBmb3IgZWFjaCBwcm9ibGVtLgotCSAqLwotCXB1YmxpYyBMaXN0IHBhcnNlTWVzc2FnZSgpIHsKLQkJLy8gbm93IHBhcnNlIHRvIHNlZSBpZiBhbGwgYXBvc3Ryb3BoZXMgYXJlIGluIHBhaXJzLCBpZiB0aGVyZSBhcmUgcGFyYW1ldGVycyBvciBub3QsIGV0Yy4KLQkJQXJyYXlMaXN0IGludExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBudW1PYnJhY2tldHMgPSAwOwotCQlpbnQgbnVtQ2JyYWNrZXRzID0gMDsKLQkJaW50IGluZGV4ID0gMDsKLQkJY2hhciB0b2tlbjsKLQkJaW50IHNpbmdsZVF1b3RlSW5kZXggPSAtMTsKLQkJaW50IGRvdWJsZVF1b3RlSW5kZXggPSAtMTsKLQkJaW50IG1pc3NpbmdUZXJtaW5hdGluZ1F1b3RlSW5kZXggPSAtMTsKLQkJYm9vbGVhbiBwYXJtRXhpc3RzID0gZmFsc2U7Ci0JCWludCBudW1DaGFyQmVmb3JlU2hvcnQgPSBnZXRNZXNzYWdlT2Zmc2V0KCkgKyBnZXRNZXNzYWdlKCkuaW5kZXhPZihnZXRTaG9ydE1lc3NhZ2UoKSk7Ci0JCQotCQl3aGlsZSAoaW5kZXggPCBnZXRTaG9ydE1lc3NhZ2UoKS5sZW5ndGgoKSkgewotCQkJdG9rZW4gPSBnZXRTaG9ydE1lc3NhZ2UoKS5jaGFyQXQoaW5kZXgrKyk7Ci0JCQlpZiAodG9rZW4gPT0gUVVPVEUpIHsKLQkJCQlpZiAoaW5kZXggPCBnZXRTaG9ydE1lc3NhZ2UoKS5sZW5ndGgoKSkgewotCQkJCQl0b2tlbiA9IGdldFNob3J0TWVzc2FnZSgpLmNoYXJBdChpbmRleCsrKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRva2VuID0gJyAnOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoKHRva2VuID09IE9CUkFDS0VUKSB8fCAodG9rZW4gPT0gQ0JSQUNLRVQpKXsKLQkJCQkJaWYgKGluZGV4IDwgZ2V0U2hvcnRNZXNzYWdlKCkubGVuZ3RoKCkpIHsKLQkJCQkJCXRva2VuID0gZ2V0U2hvcnRNZXNzYWdlKCkuY2hhckF0KGluZGV4KyspOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdG9rZW4gPSAnICc7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIERvZXMgdGhlIHsgb3IgfSBjaGFyYWN0ZXIgaGF2ZSBhIHRlcm1pbmF0aW5nIHNpbmdsZSBxdW90ZT8KLQkJCQkJaWYodG9rZW4gIT0gUVVPVEUpIHsKLQkJCQkJCW1pc3NpbmdUZXJtaW5hdGluZ1F1b3RlSW5kZXggPSAobnVtQ2hhckJlZm9yZVNob3J0ICsgaW5kZXgtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHRva2VuID09IFFVT1RFKSkgewotCQkJCQlkb3VibGVRdW90ZUluZGV4ID0gKG51bUNoYXJCZWZvcmVTaG9ydCArIGluZGV4LTEpOwotCQkJCX0KLQkJCQllbHNlICB7Ci0JCQkJCS8vICd7JyBtZWFucyB0aGF0IGEgeyB3aWxsIGJlIG91dHB1dCwKLQkJCQkJLy8gJ30nIG1lYW5zIHRoYXQgYSB9IHdpbGwgYmUgb3V0cHV0LAotCQkJCQkvLyAnJyBtZWFucyB0aGF0IGEgJyB3aWxsIGJlIG91dHB1dC4KLQkJCQkJCi0JCQkJCS8vIFNpbmNlIHRoZSBxdW90ZSBpcyBhIHNwZWNpYWwgY2hhcmFjdGVyLCBhbmQgdGhlIG9wZW5pbmcgYnJhY2tldCBpcyBhIAotCQkJCQkvLyBzcGVjaWFsIGNoYXJhY3Rlciwga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIG9wZW4gYnJhY2tldHMuIElmIHRoZQotCQkJCQkvLyBmb2xsb3dpbmcgY2hhcmFjdGVyIGlzbid0IGEgcXVvdGUgb3Igb3BlbmluZyBicmFja2V0LCB3YXJuIHRoZSB1c2VyIAotCQkJCQkvLyB0aGF0IGl0IHRha2VzIHR3byBhcG9zdHJvcGhlcyB0byBzZWUgb25lIGFwb3N0cm9waGUuCi0JCQkJCXNpbmdsZVF1b3RlSW5kZXggPSAobnVtQ2hhckJlZm9yZVNob3J0ICsgaW5kZXgtMSk7Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW4gPT0gT0JSQUNLRVQpIHsKLQkJCQludW1PYnJhY2tldHMrKzsKLQkJCQlwYXJtRXhpc3RzID0gdHJ1ZTsKLQkJCQlTdHJpbmdCdWZmZXIgbnVtQnVmZmVyID0gbnVsbDsKLQkJCQlpZiAoaW5kZXggPCBnZXRTaG9ydE1lc3NhZ2UoKS5sZW5ndGgoKSkgewotCQkJCQludW1CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCXdoaWxlIChpbmRleCA8IGdldFNob3J0TWVzc2FnZSgpLmxlbmd0aCgpKSB7Ci0JCQkJCQljaGFyIGRpZ2l0ID0gZ2V0U2hvcnRNZXNzYWdlKCkuY2hhckF0KGluZGV4KTsKLQkJCQkJCWlmICgoQ2hhcmFjdGVyLmlzRGlnaXQoZGlnaXQpKSB8fCAoZGlnaXQgPT0gJy0nKSB8fCAoZGlnaXQgPT0gJysnKSkgewotCQkJCQkJCW51bUJ1ZmZlci5hcHBlbmQoZGlnaXQpOwotCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90IGFuIGVycm9yOyBqdXN0IG5vdCBhIG51bWJlci4gQ291bGQgYmUgb25lIG9mIHRoZSBvdGhlciAKLQkJCQkJLy8gQ2hvaWNlRm9ybWF0LCBvciB3aGF0ZXZlciwgZm9ybWF0cy4gRG8gbm90IGdldCB0aGUgbmV4dCAKLQkJCQkJLy8gdG9rZW4sIGJlY2F1c2Ugd2Ugc3RpbGwgbmVlZCB0byBwcm9jZXNzIHRoaXMgb25lLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQlpZiAoKG51bUJ1ZmZlciAhPSBudWxsKSAmJiAobnVtQnVmZmVyLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCUludGVnZXIgcGFybU51bSA9IEludGVnZXIudmFsdWVPZihudW1CdWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkJCQlpbnRMaXN0LmFkZChwYXJtTnVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4YykgewotCQkJCQkvLyBub3QgYW4gZXJyb3I7IGp1c3Qgbm90IGEgbnVtYmVyLiBDb3VsZCBiZSBvbmUgb2YgdGhlIG90aGVyIAotCQkJCQkvLyBDaG9pY2VGb3JtYXQsIG9yIHdoYXRldmVyLCBmb3JtYXRzLiBEbyBub3QgZ2V0IHRoZSBuZXh0IAotCQkJCQkvLyB0b2tlbiwgYmVjYXVzZSB3ZSBzdGlsbCBuZWVkIHRvIHByb2Nlc3MgdGhpcyBvbmUuCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW4gPT0gQ0JSQUNLRVQpIHsKLQkJCQludW1DYnJhY2tldHMrKzsKLQkJCX0KLQkJfQotCQkKLQkJX251bVBhcm1zID0gTWF0aC5tYXgobnVtT2JyYWNrZXRzLCBudW1DYnJhY2tldHMpOwotCi0JCS8vIGZpbmQgcGFyc2Ugd2FybmluZ3MKLQkJTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKG51bU9icmFja2V0cyAhPSBudW1DYnJhY2tldHMpIHsKLQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5FUlJPUiwgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwMDAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihudW1PYnJhY2tldHMpLCBTdHJpbmcudmFsdWVPZihudW1DYnJhY2tldHMpfSwgdGhpcywgZ2V0TGluZU51bWJlcigpKTsKLQkJCW1lc3NhZ2VzLmFkZChtbWQpOwotCQl9Ci0JCQotCQlpZihtaXNzaW5nVGVybWluYXRpbmdRdW90ZUluZGV4ICE9IC0xKSB7Ci0JCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuSU5GTywgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAxMTAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihtaXNzaW5nVGVybWluYXRpbmdRdW90ZUluZGV4KX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSwgZ2V0T2Zmc2V0KCkgKyBtaXNzaW5nVGVybWluYXRpbmdRdW90ZUluZGV4LCAxKTsgLy8gbWFnaWMgbnVtYmVyIDEgYmVjYXVzZSBhIHF1b3RlIGlzIG9uZSBjaGFyYWN0ZXIgbG9uZwotCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCX0KLQotCQkvLyBOb3cgc29ydCB0aGUgbGlzdCwgdG8gc2VlIGlmIHRoZXJlJ3MgYW55IG51bWJlcnMgbWlzc2luZywgZHVwbGljYXRlZCwgb3IgbmVnYXRpdmUKLQkJQ29sbGVjdGlvbnMuc29ydChpbnRMaXN0LCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQkvLyBuZWdhdGl2ZSA9IGIgYmVmb3JlIGEKLQkJCQkvLyB6ZXJvID0gYSA9IGIKLQkJCQkvLyBwb3NpdGl2ZSA9IGEgYmVmb3JlIGIKLQkJCQlyZXR1cm4gKChJbnRlZ2VyKSBhKS5pbnRWYWx1ZSgpIC0gKChJbnRlZ2VyKSBiKS5pbnRWYWx1ZSgpOwotCQkJfQotCQl9KTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnRMaXN0Lml0ZXJhdG9yKCk7Ci0JCWludCBwYXJtQ291bnQgPSAwOwotCQlpbnQgbGFzdE51bWJlciA9IC0xOwotCQlpbnQgbGFyZ2VzdE51bWJlciA9IC0xOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJbnRlZ2VyIHBhcm0gPSAoSW50ZWdlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHBhcm0uaW50VmFsdWUoKSA8IDApIHsKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuRVJST1IsIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDEwRSwgbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKHBhcm0uaW50VmFsdWUoKSl9LCB0aGlzLCBnZXRMaW5lTnVtYmVyKCkpOwotCQkJCW1lc3NhZ2VzLmFkZChtbWQpOwotCQkJfQotCQkJZWxzZSBpZiAocGFybS5pbnRWYWx1ZSgpID09IGxhc3ROdW1iZXIpIHsKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuSU5GTywgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwMjAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihsYXN0TnVtYmVyKX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0JCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJtLmludFZhbHVlKCkgIT0gcGFybUNvdW50KSB7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLklORk8sIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDMwLCBuZXcgU3RyaW5nW117U3RyaW5nLnZhbHVlT2YocGFybUNvdW50KX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0JCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJtQ291bnQrKzsKLQkJCX0KLQkJCWxhc3ROdW1iZXIgPSBwYXJtLmludFZhbHVlKCk7Ci0JCQlsYXJnZXN0TnVtYmVyID0gTWF0aC5tYXgobGFyZ2VzdE51bWJlciwgcGFybS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZihsYXJnZXN0TnVtYmVyID4gMCkgewotCQkJLy8gTm90IGEgY2hvaWNlIGZvcm1hdC4KLQkJCS8vCi0JCQkvLyBBbHRob3VnaCB0aGUgZmlyc3QgZGVmYXVsdCAoY291bnRpbmcgdGhlIG51bWJlciBvZiAKLQkJCS8vIGJyYWNrZXRzKSBpcyBva2F5IGluIG1vc3QgY2FzZXMsIHNvbWV0aW1lcyBhIHBhcmFtZXRlciAKLQkJCS8vIGlzIG1pc3NpbmcsIGFuZCBzbyB0aGUgbnVtYmVyIG9mIHBhcmFtdGVycyBwYXNzZWQgaW50byAKLQkJCS8vIHRoZSBNZXNzYWdlRm9ybWF0IG5lZWRzIHRvIGJlIGxhcmdlci4gKGUuZy4gezB9IHsyfSwgCi0JCQkvLyBuZWVkIFN0cmluZ1tdIHRvIGJlIHsiIiwgIiIsICIifSwgbm90IHsiIiwgIiJ9KS4gCi0JCQkKLQkJCS8vIE5lZWQgdG8gYWRkICIxIiB0byBpdCBiZWNhdXNlIHRoZSBudW1iZXJzIHN0YXJ0IGF0IGEgMCBpbmRleC4KLQkJCV9udW1QYXJtcyA9IGxhcmdlc3ROdW1iZXIgKyAxOyAKLQkJfQotCQkKLQkJaWYobGFyZ2VzdE51bWJlciA+IDkpIHsKLQkJCS8vIE1lc3NhZ2VGb3JtYXQgd2lsbCBub3Qgc3Vic3RpdHV0ZSBpbiBwYXJhbWV0ZXJzIGFmdGVyIHRoZSAxMCBwYXJhbWV0ZXIgKGkuZS4sIG51bWJlciA5KS4KLQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5XQVJOSU5HLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDAxMFcsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihsYXJnZXN0TnVtYmVyKX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0JCQltZXNzYWdlcy5hZGQobW1kKTsKLQkJfQotCi0JCWlmICgoc2luZ2xlUXVvdGVJbmRleCA+IC0xKSAmJiBwYXJtRXhpc3RzKSB7Ci0JCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuSU5GTywgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwNDAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihzaW5nbGVRdW90ZUluZGV4KX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSwgZ2V0T2Zmc2V0KCkgKyBzaW5nbGVRdW90ZUluZGV4LCAxKTsgLy8gbWFnaWMgbnVtYmVyIDEgYmVjYXVzZSBhIHF1b3RlIGlzIG9uZSBjaGFyYWN0ZXIgbG9uZwotCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCX0KLQkJZWxzZSBpZiAoKGRvdWJsZVF1b3RlSW5kZXggPiAtMSkgJiYgIXBhcm1FeGlzdHMpIHsKLQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5JTkZPLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA1MCwgbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKGRvdWJsZVF1b3RlSW5kZXgpfSwgdGhpcywgZ2V0TGluZU51bWJlcigpLCBnZXRPZmZzZXQoKSArIGRvdWJsZVF1b3RlSW5kZXgsIDEpOyAvLyBtYWdpYyBudW1iZXIgMSBiZWNhdXNlIGEgcXVvdGUgaXMgb25lIGNoYXJhY3RlciBsb25nCi0JCQltZXNzYWdlcy5hZGQobW1kKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlczsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXQgdGhpcyAucHJvcGVydGllcyBsaW5lIGZvciBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpZihnZXRGaWxlKCkgPT0gbnVsbCkgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRGaWxlKCkuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXHRMaW5lIG51bWJlcjogIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihnZXRMaW5lTnVtYmVyKCkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGdldE1lc3NhZ2VJZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRNZXNzYWdlKCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIEZvcm1hdCB0aGlzIC5wcm9wZXJ0aWVzIGxpbmUgZm9yIGRpc3BsYXksIGFuZCBzdWJzdGl0dXRlIGEgc3R1YiwKLQkgKiBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaW50byBlYWNoIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IHBhdHRlcm4uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZ1dpdGhFeHBlY3RlZExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpZihnZXRGaWxlKCkgPT0gbnVsbCkgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRGaWxlKCkuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXHRMaW5lIG51bWJlcjogIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihnZXRMaW5lTnVtYmVyKCkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGdldE1lc3NhZ2VJZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRFeHBlY3RlZE1lc3NhZ2UobGVuZ3RoKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlIHByZWZpeCB3aXRob3V0IHRoZSBzZXZlcml0eSwgZS5nLiwKLQkgKiBBQkNEMDAwMCBpbnN0ZWFkIG9mIEFCQ0QwMDAwRS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TWVzc2FnZVByZWZpeCgpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJaWYocHJlZml4LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWNoYXIgcHJlZml4RW5kID0gcHJlZml4LmNoYXJBdChwcmVmaXgubGVuZ3RoKCkgLSAxKTsKLQkJaWYgKChwcmVmaXhFbmQgPT0gJ0UnKSB8fCAocHJlZml4RW5kID09ICdXJykgfHwgKHByZWZpeEVuZCA9PSAnSScpKSB7Ci0JCQlwcmVmaXggPSBwcmVmaXguc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCQotCS8qKgotCSAqIEEgUHJvcGVydHlMaW5lIGlzIGVxdWFsIGlmIGl0IGlzIGluIHRoZSBzYW1lIGZpbGUgYW5kIG9uIHRoZSBzYW1lIGxpbmUgbnVtYmVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZihvID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoIShvIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlQcm9wZXJ0eUxpbmUgb0xpbmUgPSAoUHJvcGVydHlMaW5lKW87Ci0JCWlmKCEoZ2V0TGluZU51bWJlcigpID09IG9MaW5lLmdldExpbmVOdW1iZXIoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoIWdldEZpbGUoKS5lcXVhbHMob0xpbmUuZ2V0RmlsZSgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIChnZXRGaWxlKCkuaGFzaENvZGUoKSArIGdldExpbmVOdW1iZXIoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvUHJvcGVydHlMaW5lQ29tcGFyYXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYWFkMjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgYWxsIG9mIHRoZSBDb21wYXJhdG9yIGNsYXNzZXMgdGhhdCBjYW4gYmUgdXNlZAotICogdG8gc29ydCBQcm9wZXJ0eUxpbmUgaW5zdGFuY2VzIGluIGFuIEFQcm9wZXJ0eUZpbGUuIChGb3IgZXhhbXBsZSwKLSAqIHRvIGZpbmQgZHVwbGljYXRlIG1lc3NhZ2UgaWRzLCB0aGUgTWVzc2FnZUlkQ29tcGFyYXRvciB3b3VsZCBiZSB1c2VkCi0gKiB0byBzb3J0IHRoZSBsaW5lcyBhY2NvcmRpbmcgdG8gbWVzc2FnZSBpZC4gVGhlIHNvcnRlZCBsaXN0IGlzIAotICogdHJhdmVyc2VkIHRvIGZpbmQgb3V0IGlmIG9uZSBsaW5lIGhhcyBhbiBpZGVudGljYWwgbWVzc2FnZSBpZCAKLSAqIHRvIHRoZSBsaW5lIHRoYXQgZm9sbG93cyBpdCwgYW5kIGlmIHNvLCBhIHBhcnNlIHdhcm5pbmcgaXMgcmVwb3J0ZWQuKQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlMaW5lQ29tcGFyYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlMaW5lQ29tcGFyYXRvciBpbnN0ID0gbmV3IFByb3BlcnR5TGluZUNvbXBhcmF0b3IoKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIF9tZXNzYWdlUHJlZml4Q29tcGFyYXRvciA9IGluc3QubmV3IE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBfbWVzc2FnZUlkQ29tcGFyYXRvciA9IGluc3QubmV3IE1lc3NhZ2VJZENvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBDb21wYXJhdG9yIF9zdHJpbmdMZW5ndGhDb21wYXJhdG9yID0gbmV3IFN0cmluZ0xlbmd0aENvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIF92YWx1ZUNvbXBhcmF0b3IgPSBpbnN0Lm5ldyBWYWx1ZUNvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIF9saW5lTm9Db21wYXJhdG9yID0gaW5zdC5uZXcgTGluZU5vQ29tcGFyYXRvcigpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yKCkgewotCX0JCi0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGNvbXBhcmVzIFByb3BlcnR5TGluZSBpbnN0YW5jZXMgYW5kIHNvcnRzIHRoZW0gYWNjb3JkaW5nIHRvIAotCSAqIHRoZWlyIG1lc3NhZ2UgcHJlZml4IChlLmcuLCBBQkNEMDAwMEUpLgotCSAqLwotCXByaXZhdGUgY2xhc3MgTWVzc2FnZVByZWZpeENvbXBhcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCWlmKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGEgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQkKLQkJCS8vIENhbid0IGp1c3QgbG9vayB0byBzZWUgaWYgdGhleSdyZSB0aGUgc2FtZTsgbmVlZCB0byBtYXJrCi0JCQkvLyB0aGVtIGFzIHRoZSBzYW1lIGV2ZW4gaWYgdGhlIGxhc3QgbGV0dGVyIChFfFd8SSkgaXMgZGlmZmVyZW50LgotCQkJU3RyaW5nIGFpZCA9ICgoUHJvcGVydHlMaW5lKSBhKS5nZXRNZXNzYWdlUHJlZml4KCk7Ci0JCQlTdHJpbmcgYmlkID0gKChQcm9wZXJ0eUxpbmUpIGIpLmdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJCWlmKChhaWQgPT0gbnVsbCkgJiYgKGJpZCA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhaWQgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYmlkID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQkKLQkJCWFpZCA9IGFpZC50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKLQkJCWJpZCA9IGJpZC50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKLQotCQkJaWYoKGFpZC5lcXVhbHMoIiIpKSAmJiAoYmlkLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYWlkLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYmlkLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlyZXR1cm4gKChQcm9wZXJ0eUxpbmUpYSkuZ2V0U2hvcnRNZXNzYWdlUHJlZml4KCkudG9VcHBlckNhc2UoKS5jb21wYXJlVG8oKChQcm9wZXJ0eUxpbmUpYikuZ2V0U2hvcnRNZXNzYWdlUHJlZml4KCkudG9VcHBlckNhc2UoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjb21wYXJhdG9yIHNvcnRzIFByb3BlcnR5TGluZSBieSB0aGVpciBtZXNzYWdlIGlkLgotCSAqLwotCXByaXZhdGUgY2xhc3MgTWVzc2FnZUlkQ29tcGFyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGFNZXNzYWdlSWQgPSBudWxsOwotCQkJU3RyaW5nIGJNZXNzYWdlSWQgPSBudWxsOwotCQkJaWYoYSBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJCWFNZXNzYWdlSWQgPSAoKFByb3BlcnR5TGluZSlhKS5nZXRNZXNzYWdlSWQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFNZXNzYWdlSWQgPSAoU3RyaW5nKWE7Ci0JCQl9Ci0JCQkKLQkJCWlmKGIgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCQliTWVzc2FnZUlkID0gKChQcm9wZXJ0eUxpbmUpYikuZ2V0TWVzc2FnZUlkKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQliTWVzc2FnZUlkID0gKFN0cmluZyliOwotCQkJfQotCQkJCQotCQkJCi0JCQlpZigoYU1lc3NhZ2VJZCA9PSBudWxsKSAmJiAoYk1lc3NhZ2VJZCA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhTWVzc2FnZUlkID09IG51bGwpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQllbHNlIGlmKGJNZXNzYWdlSWQgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIGFNZXNzYWdlSWQuY29tcGFyZVRvKGJNZXNzYWdlSWQpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNvcnQgdGhlIFByb3BlcnR5TGluZSBieSB0aGUgbGVuZ3RoIG9mIGNoYXJhY3RlcnMgaW4gdGhlIG1lc3NhZ2UgdGV4dDsKLQkgKiBpZiB5b3Ugd2FudCB0byBzdWJzdGl0dXRlIGNoYXJhY3RlcnMgZm9yIHRoZSBtZXNzYWdlIHBhcmFtZXRlcnMsIAotCSAqIHNldCB0aGUgbGVuZ3RoIGZpZWxkLgotCSAqLwotCXN0YXRpYyBjbGFzcyBTdHJpbmdMZW5ndGhDb21wYXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IgewotCQlwdWJsaWMgc3RhdGljIGludCBsZW5ndGggPSAwOwotCQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJLy8gcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIG9iamVjdCBhIGlzIGxlc3MgdGhhbiBvYmplY3QgYgotCQkJLy8gcmV0dXJuIGEgemVybyBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1YWwKLQkJCS8vIHJldHVybiBhIHBvc2l0aXZlIG51bWJlciBpZiBvYmplY3QgYSBpcyBncmVhdGVyIHRoYW4gb2JqZWN0IGIKLQkJCWlmKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGEgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQkKLQkJCWludCBhTGVuZ3RoID0gKChQcm9wZXJ0eUxpbmUpYSkuZ2V0RXhwZWN0ZWRMZW5ndGgobGVuZ3RoKTsKLQkJCWludCBiTGVuZ3RoID0gKChQcm9wZXJ0eUxpbmUpYikuZ2V0RXhwZWN0ZWRMZW5ndGgobGVuZ3RoKTsKLQkJCQkKLQkJCXJldHVybiAoYUxlbmd0aCAtIGJMZW5ndGgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFscGhhYmV0aXplIHRoZSBtZXNzYWdlIHRleHQgb2YgdGhlIFByb3BlcnR5TGluZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFZhbHVlQ29tcGFyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGFNZXNzYWdlID0gKChQcm9wZXJ0eUxpbmUpYSkuZ2V0TWVzc2FnZSgpOwotCQkJU3RyaW5nIGJNZXNzYWdlID0gKChQcm9wZXJ0eUxpbmUpYikuZ2V0TWVzc2FnZSgpOwotCQkJaWYoKGFNZXNzYWdlID09IG51bGwpICYmIChiTWVzc2FnZSA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQkJCi0JCQlyZXR1cm4gYU1lc3NhZ2UuY29tcGFyZVRvKGJNZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTb3J0IGJ5IGxpbmUgbnVtYmVyIG9mIHRoZSBQcm9wZXJ0eUxpbmUsIHdpdGggdGhlIHNtYWxsZXN0IGxpbmUKLQkgKiBudW1iZXIgZmlyc3QgaW4gdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMaW5lTm9Db21wYXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkvLyByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgb2JqZWN0IGEgaXMgbGVzcyB0aGFuIG9iamVjdCBiCi0JCQkvLyByZXR1cm4gYSB6ZXJvIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVhbAotCQkJLy8gcmV0dXJuIGEgcG9zaXRpdmUgbnVtYmVyIGlmIG9iamVjdCBhIGlzIGdyZWF0ZXIgdGhhbiBvYmplY3QgYgotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJaW50IGFMaW5lTm8gPSAoKFByb3BlcnR5TGluZSlhKS5nZXRMaW5lTnVtYmVyKCk7Ci0JCQlpbnQgYkxpbmVObyA9ICgoUHJvcGVydHlMaW5lKWIpLmdldExpbmVOdW1iZXIoKTsKLQkJCWlmKChhTGluZU5vIDwgMCkgJiYgKGJMaW5lTm8gPCAwKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhTGluZU5vIDwgMCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYkxpbmVObyA8IDApIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIChhTGluZU5vIC0gYkxpbmVObyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgZ2V0TWVzc2FnZVByZWZpeENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBfbWVzc2FnZVByZWZpeENvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBfbWVzc2FnZUlkQ29tcGFyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgZ2V0U3RyaW5nTGVuZ3RoQ29tcGFyYXRvcihpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0xlbmd0aENvbXBhcmF0b3IubGVuZ3RoID0gbGVuZ3RoOwotCQlyZXR1cm4gX3N0cmluZ0xlbmd0aENvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldFZhbHVlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIF92YWx1ZUNvbXBhcmF0b3I7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBnZXRMaW5lTm9Db21wYXJhdG9yKCkgewotCQlyZXR1cm4gX2xpbmVOb0NvbXBhcmF0b3I7Ci0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Jlc291cmNlSGFuZGxlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkN2I1NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Jlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmV0cmlldmVzIHRoZSBTdHJpbmdzIGZyb20gdGhlIC5wcm9wZXJ0aWVzIGZpbGUgYXBwcm9wcmlhdGUKLSAqIGZvciB0aGUgbWFjaGluZSdzIExvY2FsZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJlc291cmNlSGFuZGxlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgX2J1bmRsZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlcwotCSAqIGluIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IGJ1bmRsZU5hbWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBidW5kbGVOYW1lKSB7Ci0JCWlmIChfYnVuZGxlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJX2J1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lKTsKLQkJCX0KLQkJCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXhjKSB7Ci0JCQkJX2J1bmRsZSA9IG51bGw7Ci0JCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBfYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIHRoZSBidW5kbGUgYW5kIHRoZSBtZXNzYWdlIGlkIChrZXkpIGludG8gdGhlCi0JICogYnVuZGxlLCByZXR1cm4gdGhlIG1lc3NhZ2UgdGV4dCBpZGVudGlmaWVkIGJ5IHRoZSBpZC4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOwotCQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGtleTsKLQkJCX0KLQotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZSwgdGhlIG1lc3NhZ2UgaWQgKGtleSkgaW50byB0aGUKLQkgKiBidW5kbGUsIGFuZCBwYXJhbWV0ZXJzIHRvIGJlIHN1YnN0aXR1dGVkIGludG8gdGhlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0J3MKLQkgKiBwYXR0ZXJucywgcmV0dXJuIHRoZSBtZXNzYWdlIHdpdGggdGhlIHBhcmFtZXRlcnMgc3Vic3RpdHV0ZWQgaW4uCi0JICovCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBrZXksIFN0cmluZ1tdIHBhcm1zKSB7Ci0JCVN0cmluZyByZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmVzID0gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEV4dGVybmFsaXplZE1lc3NhZ2UoYnVuZGxlTmFtZSwga2V5KSwgcGFybXMpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3IvcHJvcGVydGllc1ZhbGlkYXRvci5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3IvcHJvcGVydGllc1ZhbGlkYXRvci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2E1YmRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL3Byb3BlcnRpZXNWYWxpZGF0b3IucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMKLSMgTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0jIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSMgVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSMgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotIwotIyAgRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotIyAgVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSMgIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSMgIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotIyAgeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0jICAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0jICBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotIyAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0jICBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSMgIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSMgIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSMKLQotQUJDRDAwMDAgPSBBQkNEMDAwMEU6IE1hdGNoIHRoZSBicmFjZXMgaW4gdGhlIG1lc3NhZ2UuIFRoZXJlIGFyZSB7MH0gJ3snIGFuZCB7MX0gJ30nLiBNZXNzYWdlRm9ybWF0IHdpbGwgdGhyb3cgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHRoZXJlIGFyZSBtaXNtYXRjaGluZyBicmFjZXMuCi1BQkNEMDAxMEUgPSBBQkNEMDAxMEU6IENoYW5nZSBhcmd1bWVudCAoJ3snezB9J30nKSB0byBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgOSBpbmNsdXNpdmUgaW4gdGhlIG1lc3NhZ2UuIE1lc3NhZ2VGb3JtYXQgY2Fubm90IHByb2Nlc3MgYW4gaW50ZWdlciBwYXJhbWV0ZXIgdGhhdCBpcyBsZXNzIHRoYW4gMC4KLUFCQ0QwMDEwVyA9IEFCQ0QwMDEwVzogQ2hhbmdlIGFyZ3VtZW50ICgneyd7MH0nfScpIHRvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA5IGluY2x1c2l2ZSBpbiB0aGUgbWVzc2FnZS4gTWVzc2FnZUZvcm1hdCBpZ25vcmVzIGFueSBwYXJhbWV0ZXJzIGxhcmdlciB0aGFuIDkuCi1BQkNEMDAyMCA9IEFCQ0QwMDIwSTogUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXIgJ3snezB9J30nIGZyb20gdGhlIG1lc3NhZ2UuIE1ha2UgbWVzc2FnZXMgc3VjY2luY3QuCi1BQkNEMDAzMCA9IEFCQ0QwMDMwSTogQ2hlY2sgdGhhdCBhcmd1bWVudCAneyd7MH0nfScgd2FzIG9taXR0ZWQgZnJvbSB0aGUgbWVzc2FnZSBkZWxpYmVyYXRlbHkuIElmIGl0IHdhcyBvbWl0dGVkIGFjY2lkZW50YWxseSwgYW5kIHRoZSBjb2RlIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIHBhcmFtZXRlcnMsIE1lc3NhZ2VGb3JtYXQgd2lsbCB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLgotQUJDRDAwNDAgPSBBQkNEMDA0MEk6IFVzZSB0d28gYXBvc3Ryb3BoZXMgaW4gdGhlIG1lc3NhZ2UgYXQgY29sdW1uIHswfS4gTWVzc2FnZUZvcm1hdCByZW1vdmVzIHNpbmdsZSBhcG9zdHJvcGhlczsgZm9yIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYW4gYXBvc3Ryb3BoZSwgdHdvIGFwb3N0cm9waGVzIG11c3QgZXhpc3QgaW4gdGhlIHN0cmluZy4gKEFuIGFwb3N0cm9waGUgaXMgYSByZXNlcnZlZCBjaGFyYWN0ZXIgb2YgTWVzc2FnZUZvcm1hdC4pCi1BQkNEMDA1MCA9IEFCQ0QwMDUwSTogVXNlIG9uZSBhcG9zdHJvcGhlIGluIHRoZSBtZXNzYWdlIGF0IGNvbHVtbiB7MH0uIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc2VzIG9ubHkgbWVzc2FnZXMgd2l0aCBwYXJhbWV0ZXJzOyB3aXRob3V0IE1lc3NhZ2VGb3JtYXQsIHRoZSBleHRyYSBhcG9zdHJvcGhlIHdpbGwgbm90IGJlIHJlbW92ZWQuCi0KLUFCQ0QwMDYwID0gQUJDRDAwNjBXOiBNYWtlIHswfSB1bmlxdWUuIFdoZW4gYW4gaWQgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIGZpbGUsIFJlc291cmNlQnVuZGxlIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBtZXNzYWdlIGlkLgotQUJDRDAwNzAgPSBBQkNEMDA3MFc6IHswfSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLgotCi1BQkNEMDA4MCA9IEFCQ0QwMDgwRTogRml4IHRoZSBzeW50YXggZXJyb3I7IGVhY2ggbGluZSBtdXN0IGZvcm0gTUVTU0FHRV9JRCA9IE1FU1NBR0UuCi1BQkNEMDA5MCA9IEFCQ0QwMDkwVzogQ2hlY2sgdGhlIHJlYWQgcGVybWlzc2lvbnMgb2YgZmlsZSB7MH0uIFRoZSBQcm9wZXJ0aWVzVmFsaWRhdG9yIGVpdGhlciBjYW5ub3QgcmVhZCBvciBjYW5ub3QgZmluZCB0aGUgZmlsZS4KLQotQUJDRDAxMTAgPSBBQkNEMDExMEk6IEFkZCBhIHRlcm1pbmF0aW5nIGFwb3N0cm9waGUgYXQgY29sdW1uIHswfS4gVGhlICd7JyBhbmQgJ30nIGNoYXJhY3RlcnMgbXVzdCBiZSBlbmNsb3NlZCBpbiBhcG9zdHJvcGhlcy4KLQotQUJDRDAxMjAgPSBBQkNEMDEyMEk6IFRlcm1pbmF0ZSBtZXNzYWdlIHByZWZpeCB7MH0gd2l0aCBhICcnOicnLiBUaGUgSUJNIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgbWVzc2FnZSBwcmVmaXhlcyBlbmQgd2l0aCBhIGNvbG9uLgotQUJDRDAxMzAgPSBBQkNEMDEzMEk6IFJlbW92ZSB0aGUgd2hpdGVzcGFjZSBiZXR3ZWVuIHswfSBhbmQgdGhlICcnOicnLiBUaGUgSUJNIHN0YW5kYXJkIHJlcXVpcmVzIGFuIGFic2VuY2Ugb2Ygd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdGhlIGNvbG9uLgotCi0jIE91dHNpZGUgV1NBRCwgYXBwZW5kIHRoZSBsaW5lIG51bWJlciBhbmQgZmlsZSBuYW1lIHRvIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UuCi1MSU5FX0xPQyA9IExpbmUgezB9LCBmaWxlIHsxfS4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Rlc3QvdGVzdC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Rlc3QvdGVzdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGJjOTgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS90ZXN0L3Rlc3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0jIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSMgVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSMgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotIwotIyAgRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotIyAgVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSMgIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSMgIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotIyAgeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0jICAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0jICBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotIyAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0jICBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSMgIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSMgIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSMKLQotIyBUaGlzIGZpbGUgaXMgdXNlZCB0byB0ZXN0IHRoZSBQcm9wZXJ0aWVzIFZhbGlkYXRvci4KLSMKLQotTUlTTUFUQ0hFRF9CUkFDRVMgPSBUaGlzIGxpbmUgaGFzICd7MH0nIG1pc21hdGNoaW5nIGJyYWNlcy4KLU1JU01BVENIRURfQlJBQ0VTXzIgPSBUaGlzIGxpbmUgaGFzIHsgYSBtaXNtYXRjaGluZyBicmFjZS4KLU1JU01BVENIRURfQlJBQ0VTXzMgPSBUaGlzIGxpbmUgaGFzIH0gYSBtaXNtYXRjaGluZyBicmFjZS4KLU1JU01BVENIRURfQlJBQ0VTX09LQVkgPSBUaGlzIGxpbmUgaGFzIG5vICd7JyBtaXNtYXRjaGluZyBicmFjZXMgJ30nLgotTUlTTUFUQ0hFRF9CUkFDRVNfT0tBWTIgPSBUaGlzIGxpbmUgYWxzbyBoYXMgbm8gbWlzbWF0Y2hpbmcgYnJhY2VzIHswfSAneycgJ30nLgotCi1UT09fTUFOWV9BUkdVTUVOVFMgPSBNZXNzYWdlRm9ybWF0IGZvcm1hdHMgb25seSAxMCBwYXJhbWV0ZXJzIHswfSB7MX0gezJ9IHszfSB7NH0gezV9IHs2fSB7N30gezh9IHs5fSB7MTB9LgotVE9PX01BTllfQVJHVU1FTlRTXzIgPSBNZXNzYWdlRm9ybWF0IGZvcm1hdHMgb25seSAxMCBwYXJhbWV0ZXJzIHsxMH0uCi0KLU5FR0FUSVZFX0FSR1VNRU5UID0gVGhpcyBsaW5lIHVzZXMgYSBuZWdhdGl2ZSB7LTF9IGFyZ3VtZW50LgotQiA9IG9rYXkKLVJFRFVOREFOVF9BUkdVTUVOVCA9IFRoaXMgbGluZSB1c2VzIGEgcmVkdW5kYW50IHswfSB7MH0gYXJndW1lbnQuCi1NSVNTRURfUEFSTSA9IFRoaXMgbGluZSB1c2VzIHswfSBhbmQgezJ9IGJ1dCBub3QgKDEpLgotTkVFRFNfRE9VQkxFX0FQT1MgPSBUaGlzIGxpbmUgdXNlcyBhIHNpbmdsZSBhcG9zdHJvcGhlICgnKSBidXQgc2hvdWxkIHVzZSB0d28gezB9LgotTkVFRFNfU0lOR0xFX0FQT1MgPSBUaGlzIGxpbmUgdXNlcyBhIGRvdWJsZSBhcG9zdHJvcGhlICgnJykgYnV0IHNob3VsZCB1c2Ugb25lLgotQSA9IG9rYXkKLVNZTQotRFVQTElDQVRFX0lEID0gVGhpcyBsaW5lIHVzZXMgYSBkdXBsaWNhdGUgbWVzc2FnZSBpZC4KLURVUExJQ0FURV9JRCA9IFRoaXMgbGluZSBhbHNvIHVzZXMgYSBkdXBsaWNhdGUgbWVzc2FnZSBpZC4KLURVUExJQ0FURV9QUkVGSVggPSBBQUFBMDAwMFc6IFRoaXMgbGluZSB1c2VzIGEgZHVwbGljYXRlIG1lc3NhZ2UgcHJlZml4LgotPSBqamoKLQotRFVQTElDQVRFX1BSRUZJWDIgPSBBQUFBMDAwMFc6IFRoaXMgbGluZSBhbHNvIHVzZXMgYSBkdXBsaWNhdGUgbWVzc2FnZSBwcmVmaXguCi1aX0RVUExJQ0FURSA9IGpqagotWl9EVVBMSUNBVEUgPSBtbW0KLQotIyBUaGlzIGlzIGEgY29tbWVudAotWl9EVVBMSUNBVEUgPSBubm4KLUMgPSBva2F5Ci1GID0gYSBcCi1iIFwKLWMKLUQgPSBva2F5Ci0KLUNBU0UxID0gQUJDRDAwMDBFOiBCbGFoIEJsYWggQmxhaAotQ0FTRTIgPSBBQkNEMDAwMEUgIEJsYWggQmxhaCBCbGFoCi1DQVNFMyA9IEFCQ0QwMDAwRSA6IEJsYWggQmxhaCBCbGFoCi1DQVNFNCA9IEFCQ0QwMDAwRSAgQmxhaDpCbGFoIEJsYWgKLUNBU0U1ID0gQUJDRDAwMDBFIDoKLUNBU0U2ID0gQmxhaCBCbGFoIEJsYWggKGkuZS4sIG5vIHByZWZpeCkKLUNBU0U3ID0gQUJDRDAwMDBFOiBCbGFoCi1DQVNFOCA9IEFCQ0QwMDAwRSAgQmxhaAotQ0FTRTkgPSBBQkNEMDAwMEUgOiBCbGFoCi1DQVNFMTAgPSBBQkNEMDAwMEUgQmxhaAotQ0FTRTExID0gQUJDRDAwMDBFCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvdGVzdC90ZXN0Mi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Rlc3QvdGVzdDIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjMGYzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvdGVzdC90ZXN0Mi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIwotIyBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSMgKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotIyBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotIyByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0jCi0jICBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0jICBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotIyAgQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotIyAgcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0jICB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSMgICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSMgIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0jICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSMgIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotIyAgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotIyAgaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotIwotCi0jCi0jIFRoaXMgZmlsZSBpcyB1c2VkIHRvIHRlc3QgdGhlIFByb3BlcnRpZXMgVmFsaWRhdG9yLgotIwotCi1JRDEgPSBUaGlzIGZpbGUgaGFzIG5vIGVycm9ycyBpbiBpdC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvdHZ0cGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS90dnRwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTI1MGEzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS90dnRwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4KLSAgIGlkPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnByb3AiCi0gICBuYW1lPSJQcm9wZXJ0aWVzIFZhbGlkYXRvciIKLSAgIHZlcnNpb249IjUuMS4wIgotICAgY2xhc3M9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24ucHJvcGVydGllcy53b3JrYmVuY2hpbXBsLlByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4iPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBXaGVuIHRlc3RpbmcgVFZUIGluIEVKQkRlcGxveSwgYmVjYXVzZSBvcmcuZWNsaXBzZS5oZWxwIGlzbid0ICAgLS0+Ci0JPCEtLSBwYWNrYWdlZCB3aXRoIEVKQkRlcGxveSwgdGhpcyBwbHVnaW4gaXMgZGVhY3RpdmF0ZWQuIEhvd2V2ZXIsICAgLS0+Ci0JPCEtLSBiZWNhdXNlIHRoZSBUVlQgcGx1Z2luIGRvZXNuJ3Qgc2hpcCB0aGUgZG9jdW1lbnRhdGlvbiwgYWxsICAgICAgLS0+Ci0JPCEtLSByZWZlcmVuY2VzIHRvIHRoZSBoZWxwIGNhbiBiZSByZW1vdmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJydW50aW1lL3Byb3BlcnRpZXNWYWxGUy5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJydW50aW1lL3Byb3BlcnRpZXNWYWxXQi5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJydW50aW1lL2ZpbGVzeXN0ZW1GV0suamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgCi0gICAgPHJlcXVpcmVzPgotICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiIHZlcnNpb249IjIuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIHZlcnNpb249IjIuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiIHZlcnNpb249IjIuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbiIgZXhwb3J0PSJ0cnVlIiB2ZXJzaW9uPSI1LjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5pYm0uZXRvb2xzLmxvZ2dpbmcudXRpbCIgdmVyc2lvbj0iNS4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgIDwvcmVxdWlyZXM+Ci0KLSAgICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICAgPCEtLSBQcm9wZXJ0aWVzIFZhbGlkYXRvciBDb250cmlidXRpb25zICAgIC0tPgotICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgaWQ9IlByb3BlcnRpZXNWYWxpZGF0b3IiCi0gICAgICAgbmFtZT0iUHJvcGVydGllcyBWYWxpZGF0b3IiCi0gICAgICAgcG9pbnQ9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgICA8dmFsaWRhdG9yPgotICAgICAgICAgICA8cHJvamVjdE5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPgotICAgICAgICAgICA8ZmlsdGVyIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIgbmFtZUZpbHRlcj0iKi5wcm9wZXJ0aWVzIiBhY3Rpb249ImFkZCwgY2hhbmdlIi8+Ci0gICAgICAgICAgIDxydW4gY2xhc3M9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24ucHJvcGVydGllcy5Qcm9wZXJ0aWVzVmFsaWRhdG9yIiBlbmFibGVkPSJmYWxzZSIgYXN5bmM9InRydWUiLz4KLSAgICAgICAgICAgPGhlbHBlciBjbGFzcz0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5wcm9wZXJ0aWVzLndvcmtiZW5jaGltcGwuUHJvcGVydGllc0hlbHBlciIvPgotICAgICAgIDwvdmFsaWRhdG9yPgotICAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMjdhOWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqVW5pdFdyYXBwZXIvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0RndrLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjg0YzVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi12YWxpZGF0aW9udGVzdC5qYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2E1YzQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzFiYTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jRnJpIEZlYiAxNSAwNTo0MzowOCBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz1fCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz1fCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkNmI5Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNGcmkgRmViIDE1IDA1OjQzOjA4IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKLW9yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5rZXl3b3JkdGhpcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLm92ZXJyaWRlYW5ub3RhdGlvbj10cnVlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjYWQyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLAotIG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLmplbSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5hcGkudGVzdCwKLSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LAotIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLAotIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvciwKLSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LAotIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0LAotIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAKLUJ1bmRsZS1DbGFzc1BhdGg6IHZhbGlkYXRpb250ZXN0LmphcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjAyNmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotc291cmNlLnZhbGlkYXRpb250ZXN0LmphciA9IGpVbml0V3JhcHBlci8sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RndrLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdGVzdElucHV0LyxcCi0gICAgICAgICAgICAgICB2YWxpZGF0aW9udGVzdC5qYXIsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLW91dHB1dC52YWxpZGF0aW9udGVzdC5qYXIgPSBiaW4vCi1qYXJzLmNvbXBpbGUub3JkZXIgPSB2YWxpZGF0aW9udGVzdC5qYXIKLXNvdXJjZS52YWxpZGF0aW9udGVzdC5qYXIgPSBqVW5pdFdyYXBwZXIvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZ3ay8KLSAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTQ3ZGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQ09OVEFDVD1ydXRoZGFseUBjYS5pYm0uY29tCi1Db21wb25lbnRTaG9ydE5hbWU9VmFsVGVzdAotQ29tcG9uZW50RnVsbE5hbWU9VmFsaWRhdGlvbiBCVlQgUGx1Z2luCi1Db21wb25lbnRDb21wZXRlbmN5PUJWVAotSmF2YUNvbXBpbGUuMT1zcmNqYXIKLUJ1aWxkVmVyaWZpY2F0aW9uLjE9ZGlyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9wYWNrYWdlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OTBkOGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udGVzdCIgZGVmYXVsdD0icGFja2FnaW5nUGx1Z2luIiBiYXNlZGlyPSIuLy4uIj4KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFja2FnZURpciIgdmFsdWU9IiIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLmRpcmVjdG9yeSIgIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uaWQiIHZhbHVlPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnRlc3QiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi52ZXJzaW9uIiAgdmFsdWU9IiIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0icGFja2FnaW5nUGx1Z2luIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHtwbHVnaW4uaWR9Ii8+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke3BhY2thZ2VEaXJ9L3BsdWdpbnMvJHtwbHVnaW4uaWR9XyR7cGx1Z2luLnZlcnNpb259Ij4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW4uZGlyZWN0b3J5fSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icGx1Z2luLnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InRlc3R2YWxpZGF0aW9uLmJhdCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InRlc3R2YWxpZGF0aW9uLnNoIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS90ZXN0LmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InJ1bnRpbWUvalVuaXRXcmFwcGVyLmphciIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3NvdXJjZWphci50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3NvdXJjZWphci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YmQ0NzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9zb3VyY2VqYXIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi10ZXN0Ci1qVW5pdFdyYXBwZXIKLQotCi0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC93c0J1aWxkLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQvd3NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZGI5NWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC93c0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIHByb2plY3QgWwotCTwhRU5USVRZIGJhc2VCdWlsZCBTWVNURU0gImZpbGU6Li4vLi4vd3NCdWlsZERlZi54bWwiPgotXT4KLQotPHByb2plY3QgbmFtZT0iYnVpbGRQbHVnaW4iIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLy4uIj4KLQotPCEtLSBpbmNsdWRlIHRoZSBjb21tb24geG1sIGJ1aWxkIGZpbGUgLS0+Ci0mYmFzZUJ1aWxkOwotCi08IS0tIGN1c3RvbWl6ZSB0aGUgamFyIGNyZWF0aW9uIGhlcmUgZm9yIG11bHRpLWphciBidWlsZHMgLS0+Ci08dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJwcmVwYXJlIiBpZj0icGx1Z2luLmlkIj4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkamFyIj4KLSAgICAgICAgPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxwYXJhbSBuYW1lPSJqYXJjbGFzc3BhdGgiIHZhbHVlPSIke3BsdWdpbi5jbGFzc3BhdGh9Ii8+Ci0gICAgPC9hbnRjYWxsPgotCi0gICAgPGFudGNhbGwgdGFyZ2V0PSJidWlsZGphciI+Ci0gICAgICAgIDxwYXJhbSBuYW1lPSJqYXJuYW1lIiB2YWx1ZT0ialVuaXRXcmFwcGVyIi8+Ci0gICAgICAgIDxwYXJhbSBuYW1lPSJqYXJjbGFzc3BhdGgiIHZhbHVlPSIke3BsdWdpbi5jbGFzc3BhdGh9OyR7cGx1Z2luLmRpcmVjdG9yeX0vJHtwbHVnaW4ubGlicmFyeS5kaXJlY3Rvcnl9L3Rlc3QuamFyIi8+Ci0gICAgPC9hbnRjYWxsPgotCi08L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9BdXRvbWF0ZWRWYWxpZGF0aW9uQlZULmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0F1dG9tYXRlZFZhbGlkYXRpb25CVlQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1NDhjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0F1dG9tYXRlZFZhbGlkYXRpb25CVlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiA5LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5hcGkudGVzdC5BcGlUZXN0c1N1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiBAYXV0aG9yIGppYWxpbgotICoKLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZFZhbGlkYXRpb25CVlQgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZURpcmVjdG9yeSA9IG51bGw7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCVVSTCB1cmwgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0gICAgICAgIAlBdXRvbWF0ZWRWYWxpZGF0aW9uQlZULmJhc2VEaXJlY3RvcnkgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwodXJsKS5nZXRGaWxlKCkgKyAidmFsaWRhdGlvblJlc291cmNlcyIgKyBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2luZyB3b3JraW5nIGRpcmVjdG9yeSBzaW5jZSBhIHdvcmtzcGFjZSBVUkwgY291bGQgbm90IGJlIGxvY2F0ZWQuIik7Ci0JCX0gCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgdW5pbXBsZW1lbnRlZE1ldGhvZHM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgICAgIGlmICh1bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgdW5pbXBsZW1lbnRlZE1ldGhvZHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEF1dG9tYXRlZFZhbGlkYXRpb25CVlQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIEF1dG9tYXRlZFZhbGlkYXRpb25CVlQuc3VpdGUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWl0ZS50ZXN0Q291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRUZXN0KHN1aXRlLnRlc3RBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QiKTsKLSAgICAgICAgLy9zdWl0ZS5hZGRUZXN0KEJWVFN1aXRlLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEFwaVRlc3RzU3VpdGUuc3VpdGUoKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0JWVFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0JWVFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzM0NTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9CVlRTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5PcGVyYXRpb25UZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlZhbGlkYXRvclRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbC5CVlRWYWxpZGF0aW9uVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotLyoqCi0gKiBXcmFwcyB0aGUgZXhpc3RpbmcgdmFsaWRhdGlvbiBidnQgY29kZSBpbiBhIEpVbml0IGFydGlmYWN0Ci0gKiBzbyB0aGF0IHRoZSB0ZXN0cyBjYW4gYmUgcnVuIHdpdGhpbiBKVW5pdC4gSW5zdGFuY2VzIG9mIHRoaXMKLSAqIGNsYXNzIHdyYXAgYWxsIG9mIHRoZSBWYWxpZGF0b3JTdWl0ZSBpbnN0YW5jZXMgdGhhdCBtdXN0IGJlIHJ1bi4KLSAqLwotcHVibGljIGNsYXNzIEJWVFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQlwcml2YXRlIE1hcCBfdmFsaWRhdG9yU3VpdGVzID0gbnVsbDsKLQkKLQlwdWJsaWMgQlZUU3VpdGUoKSB7Ci0JCV92YWxpZGF0b3JTdWl0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlsb2FkVmFsaWRhdG9yU3VpdGVzKCk7Ci0JCWxvYWRPcGVyYXRpb25TdWl0ZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRWYWxpZGF0b3JTdWl0ZXMoKSB7Ci0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRtZHMgPSBCVlRWYWxpZGF0aW9uVXRpbGl0eS5nZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yKTsKLQkJZm9yKGludCBpPTA7IGk8dG1kcy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gdG1kc1tpXTsKLQotCQkJaWYodG1kLmlzVmlzaWJsZSgpKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gdG1kLmdldFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCQkJVmFsaWRhdG9yU3VpdGUgdnMgPSAoVmFsaWRhdG9yU3VpdGUpX3ZhbGlkYXRvclN1aXRlcy5nZXQodm1kKTsKLQkJCQlpZih2cyA9PSBudWxsKSB7Ci0JCQkJCXZzID0gbmV3IFZhbGlkYXRvclN1aXRlKHZtZCk7Ci0JCQkJfQotCQkJCVZhbGlkYXRvclRlc3QgdnQgPSBuZXcgVmFsaWRhdG9yVGVzdCh0bWQsIHZzKTsKLQkJCQl2cy5hZGRUZXN0KHZ0KTsKLQkJCQlfdmFsaWRhdG9yU3VpdGVzLnB1dCh2bWQsIHZzKTsKLQkJCX0KLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdmFsaWRhdG9yU3VpdGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmFsaWRhdG9yU3VpdGUgdnMgPSAoVmFsaWRhdG9yU3VpdGUpaXRlcmF0b3IubmV4dCgpOwotCQkJYWRkVGVzdCh2cyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRPcGVyYXRpb25TdWl0ZXMoKSB7Ci0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQotCQlPcGVyYXRpb25UZXN0Y2FzZVtdIHRtZHMgPSBCVlRWYWxpZGF0aW9uVXRpbGl0eS5nZXRPcGVyYXRpb25UZXN0cyhtb25pdG9yKTsKLQkJT3BlcmF0aW9uU3VpdGUgb3MgPSBuZXcgT3BlcmF0aW9uU3VpdGUoKTsKLQkJZm9yKGludCBpPTA7IGk8dG1kcy5sZW5ndGg7IGkrKykgewotCQkJT3BlcmF0aW9uVGVzdGNhc2UgdG1kID0gdG1kc1tpXTsKLQotCQkJaWYodG1kLmlzVmlzaWJsZSgpKSB7Ci0JCQkJT3BlcmF0aW9uVGVzdCBvdCA9IG5ldyBPcGVyYXRpb25UZXN0KHRtZCwgb3MpOwotCQkJCW9zLmFkZFRlc3Qob3QpOwotCQkJfQotCQl9Ci0JCQotCQlhZGRUZXN0KG9zKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgQlZUU3VpdGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlZhbGlkYXRpb24gQlZUIFN1aXRlIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQnVpbGRJbmZvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0J1aWxkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWYwNmQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQnVpbGRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdDsKLXB1YmxpYyBjbGFzcyBCdWlsZEluZm8gewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiTGljZW5zZWQgTWF0ZXJpYWxzIC0tIFByb3BlcnR5IG9mIElCTVxuKGMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAyMDAxLDIwMDNcblVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdCdWlsZExldmVsID0gIjIwMDMxMTEyXzE5MTUtV0IyMTItQUQtVjUxMUQtVzUiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBsZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0FCdWlsZExldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0pVbml0QnVmZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0pVbml0QnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOWZlNjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9KVW5pdEJ1ZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CdWZmZXJlZFRhc2tTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotCi0KLS8qKgotICogV2hlbiB0aGUgdGVzdHMgYXJlIHJ1biBhcyBwYXJ0IG9mIEpVbml0LCByZWRpcmVjdCB0aGUgb3V0cHV0Ci0gKiB0byB0aGUgSlVuaXQgdGVzdCBjYXNlLgotICovCi1wdWJsaWMgY2xhc3MgSlVuaXRCdWZmZXIgaW1wbGVtZW50cyBJQnVmZmVyIHsKLQlwcml2YXRlIFN0cmluZyBfbG9nRmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgQnVmZmVyZWRUYXNrU3RhdHVzIF9zdGF0dXMgPSBudWxsOwotCQotCUpVbml0QnVmZmVyKFN0cmluZyBsb2dGaWxlTmFtZSkgewotCQlfc3RhdHVzID0gbmV3IEJ1ZmZlcmVkVGFza1N0YXR1cyhnZXRMb2dGaWxlTmFtZShsb2dGaWxlTmFtZSksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCV9zdGF0dXMuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRMb2dGaWxlTmFtZShTdHJpbmcgbG9nRmlsZU5hbWUpIHsKLQkJaWYoX2xvZ0ZpbGVOYW1lID09IG51bGwpIHsKLQkJCWxvZ0ZpbGVOYW1lID0gbG9nRmlsZU5hbWUucmVwbGFjZSgnICcsICdfJyk7Ci0JCQlJUGF0aCBzdGF0ZUxvY2F0aW9uID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JCQlGaWxlIGxvZyA9IG5ldyBGaWxlKHN0YXRlTG9jYXRpb24udG9PU1N0cmluZygpLCBsb2dGaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCV9sb2dGaWxlTmFtZSA9IGxvZy5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gX2xvZ0ZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gX3N0YXR1cy5nZXRMb2dGaWxlTmFtZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJX3N0YXR1cy5jbGVhcigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjZGVsaW5lYXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZGVsaW5lYXRlKFN0cmluZyB0YXNrTmFtZSkgewotCQlfc3RhdHVzLmRlbGluZWF0ZSh0YXNrTmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI2dldFByb2dyZXNzTW9uaXRvcigpCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlyZXR1cm4gX3N0YXR1cy5nZXRQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjcmVwb3J0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoKSB7Ci0JCV9zdGF0dXMucmVwb3J0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciN3cml0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9zdGF0dXMud3JpdGUobWVzc2FnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNhZGRFbGFwc2VkVGltZShqYXZhLmxhbmcuU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsYXBzZWRUaW1lKFN0cmluZyB0YXNrTmFtZSwgbG9uZyBlbGFwc2VkVGltZSkgewotCQlfc3RhdHVzLmFkZEVsYXBzZWRUaW1lKHRhc2tOYW1lLCBlbGFwc2VkVGltZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNhZGRFeGVjdXRpb25TdGF0dXMoamF2YS5sYW5nLlN0cmluZywgaW50LCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0Y2FzZU5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgaW50IHBhc3NPckZhaWwsIElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfc3RhdHVzLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0Y2FzZU5hbWUsIHN1YlRhc2tOYW1lLCBwYXNzT3JGYWlsLCBidWZmZXIsIG1lc3NhZ2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjYWRkR2xvYmFsRXhlY3V0aW9uU3RhdHVzKGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RQYXNzTmFtZSwgYm9vbGVhbiBwYXNzKSB7Ci0JCV9zdGF0dXMuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3RQYXNzTmFtZSwgcGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0UGFzc05hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgYm9vbGVhbiBwYXNzKSB7Ci0JCV9zdGF0dXMuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3RQYXNzTmFtZSwgc3ViVGFza05hbWUsIHBhc3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjaXNTdWNjZXNzZnVsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKSB7Ci0JCXJldHVybiBfc3RhdHVzLmlzU3VjY2Vzc2Z1bCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjaXNTdWNjZXNzZnVsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXJldHVybiBfc3RhdHVzLmlzU3VjY2Vzc2Z1bCh0ZXN0TmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L09wZXJhdGlvblN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L09wZXJhdGlvblN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZjdkMGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9PcGVyYXRpb25TdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB3cmFwIGFsbCBvZiB0aGUgb3BlcmF0aW9ucywgaW4gcGx1Z2luLnhtbCwKLSAqIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25TdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JcHJpdmF0ZSBKVW5pdEJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQotCXB1YmxpYyBPcGVyYXRpb25TdWl0ZSgpIHsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJWYWxpZGF0aW9uIEZyYW1ld29yayBUZXN0cyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSlVuaXRCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlpZihfYnVmZmVyID09IG51bGwpIHsKLQkJCV9idWZmZXIgPSBuZXcgSlVuaXRCdWZmZXIodG9TdHJpbmcoKSArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi5sb2ciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIF9idWZmZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3QjcnVuKGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihUZXN0UmVzdWx0IHJlc3VsdCkgewotCQlzdXBlci5ydW4ocmVzdWx0KTsKLQkJZ2V0QnVmZmVyKCkucmVwb3J0KCk7IC8vIHJlcG9ydCBvbmx5IGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaW4gdGhpcyBzdWl0ZSBoYXZlIGZpbmlzaGVkCi0JCWdldEJ1ZmZlcigpLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9PcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L09wZXJhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwYjc2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L09wZXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuT3BlcmF0aW9uVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5UZXN0Y2FzZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFJ1bm5lcjsKLQotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJ1biBhbiBJV29ya3NwYWNlUnVubmFibGUgdGhhdCB0ZXN0cyB0aGUKLSAqIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIE9wZXJhdGlvblN1aXRlIF9zdWl0ZSA9IG51bGw7Ci0JcHJpdmF0ZSBPcGVyYXRpb25UZXN0Y2FzZSBfdG1kID0gbnVsbDsKLQotCXB1YmxpYyBPcGVyYXRpb25UZXN0KE9wZXJhdGlvblRlc3RjYXNlIHRtZCwgT3BlcmF0aW9uU3VpdGUgc3VpdGUpIHsKLQkJc3VwZXIodG1kLmdldE5hbWUoKSk7IC8vIHRoZSBtZXRob2QgbmFtZWQgInRlc3QiIHJ1bnMgdGhlIHRlc3QuCi0JCV90bWQgPSB0bWQ7Ci0JCV9zdWl0ZSA9IHN1aXRlOwotCX0KLQkKLQlwdWJsaWMgSlVuaXRCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX3N1aXRlLmdldEJ1ZmZlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gX3RtZC5nZXROYW1lKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNydW5UZXN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gVGVzdGNhc2VVdGlsaXR5LmZpbmRQcm9qZWN0KF90bWQpOwotCQkJaWYoKHByb2plY3QgPT0gbnVsbCkgfHwgIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkvLyBGaWxlIG5lZWRzIHRvIGJlIGltcG9ydGVkIChpLmUuLCBzZXQgdXAgdGhlIHRlc3QpLgotCQkJCWlmKCFCVlRSdW5uZXIuc2luZ2xldG9uKCkuc2V0dXBUZXN0cyhnZXRCdWZmZXIoKSwgX3RtZCwgZmFsc2UpKSB7Ci0JCQkJCWZhaWwoIkNvdWxkIG5vdCBpbXBvcnQgaW5wdXQgZnJvbSBkaXJlY3RvcnkgIiArIFRlc3RjYXNlVXRpbGl0eS5nZXRJbnB1dERpcihfdG1kKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJZmFpbCgiUHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGlzIG5vdCBhY2Nlc3NpYmxlLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCQotCQkJX3RtZC5ydW4oZ2V0QnVmZmVyKCksIHByb2plY3QpOwotCQkJaWYoIWdldEJ1ZmZlcigpLmlzU3VjY2Vzc2Z1bChfdG1kLmdldE5hbWUoKSkpIHsKLQkJCQlmYWlsKF90bWQuZ2V0TmFtZSgpICsgIiBmYWlsZWQuIFJlYWQgdGhlIGxvZyBmb3IgZGV0YWlscy4gIiArIGdldEJ1ZmZlcigpLmdldExvZ0ZpbGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBXaGV0aGVyIHRoaXMgdGVzdCBjYXNlIGZhaWxzIG9yIG5vdCwgc2VuZCBpdHMgcmVzdWx0cyB0byB0aGUgbG9nLgotCQkJZ2V0QnVmZmVyKCkuZGVsaW5lYXRlKF90bWQuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvVmFsaWRhdG9yU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvVmFsaWRhdG9yU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmZWEzNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L1ZhbGlkYXRvclN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3Mgd3JhcCBhbGwgb2YgdGhlIDx0ZXN0PiBpbnN0YW5jZXMsCi0gKiBjb250cmlidXRlZCBpbiBwbHVnaW4ueG1sLCBmb3Igb25lIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIF92bWQgPSBudWxsOwotCXByaXZhdGUgSlVuaXRCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0KLQlwdWJsaWMgVmFsaWRhdG9yU3VpdGUoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCV92bWQgPSB2bWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBfdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBKVW5pdEJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCWlmKF9idWZmZXIgPT0gbnVsbCkgewotCQkJX2J1ZmZlciA9IG5ldyBKVW5pdEJ1ZmZlcih0b1N0cmluZygpICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmxvZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdCNydW4oanVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JCXN1cGVyLnJ1bihyZXN1bHQpOwotCQlnZXRCdWZmZXIoKS5yZXBvcnQoKTsgLy8gcmVwb3J0IG9ubHkgYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBpbiB0aGlzIHN1aXRlIGhhdmUgZmluaXNoZWQKLQkJZ2V0QnVmZmVyKCkuY2xlYXIoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvVmFsaWRhdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9WYWxpZGF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYmQwZmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9WYWxpZGF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVGVzdGNhc2VVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci0KLQotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgb25lIDx0ZXN0PiwgY29udHJpYnV0ZWQgaW4KLSAqIHBsdWdpbi54bWwsIGZvciBvbmUgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFZhbGlkYXRvclRlc3RjYXNlIF90bWQgPSBudWxsOwotCXByaXZhdGUgVmFsaWRhdG9yU3VpdGUgX3N1aXRlID0gbnVsbDsKLQotCXB1YmxpYyBWYWxpZGF0b3JUZXN0KFZhbGlkYXRvclRlc3RjYXNlIHRtZCwgVmFsaWRhdG9yU3VpdGUgc3VpdGUpIHsKLQkJc3VwZXIodG1kLmdldE5hbWUoKSk7IC8vIHRoZSBtZXRob2QgbmFtZWQgInRlc3QiIHJ1bnMgdGhlIHRlc3QuCi0JCV90bWQgPSB0bWQ7Ci0JCV9zdWl0ZSA9IHN1aXRlOwotCX0KLQkKLQlwdWJsaWMgSlVuaXRCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX3N1aXRlLmdldEJ1ZmZlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gX3RtZC5nZXRQcm9qZWN0TmFtZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNydW5UZXN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gVGVzdGNhc2VVdGlsaXR5LmZpbmRQcm9qZWN0KF90bWQpOwotCQkJaWYoKHByb2plY3QgPT0gbnVsbCkgfHwgIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkvLyBGaWxlIG5lZWRzIHRvIGJlIGltcG9ydGVkIChpLmUuLCBzZXQgdXAgdGhlIHRlc3QpLgotCQkJCWlmKCFCVlRSdW5uZXIuc2luZ2xldG9uKCkuc2V0dXBUZXN0cyhnZXRCdWZmZXIoKSwgX3RtZCwgZmFsc2UpKSB7Ci0JCQkJCWZhaWwoIkNvdWxkIG5vdCBpbXBvcnQgaW5wdXQgZnJvbSBkaXJlY3RvcnkgIiArIFRlc3RjYXNlVXRpbGl0eS5nZXRJbnB1dERpcihfdG1kKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJZmFpbCgiUHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGlzIG5vdCBhY2Nlc3NpYmxlLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCQotCQkJX3RtZC5ydW4oZ2V0QnVmZmVyKCksIHByb2plY3QpOwotCQkJaWYoIWdldEJ1ZmZlcigpLmlzU3VjY2Vzc2Z1bChfdG1kLmdldE5hbWUoKSkpIHsKLQkJCQlmYWlsKF90bWQuZ2V0TmFtZSgpICsgIiBmYWlsZWQuIFJlYWQgdGhlIGxvZyBmb3IgZGV0YWlscy4gIiArIGdldEJ1ZmZlcigpLmdldExvZ0ZpbGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlWYWxpZGF0b3JNYW5hZ2VyIHZtID0gVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCk7Ci0JCQlWYWxpZGF0b3JNYW5hZ2VyLmFkZFByb2plY3RCdWlsZFZhbGlkYXRpb25TdXBwb3J0KHByb2plY3QpOwotCQkJdm0uZW5hYmxlVmFsaWRhdG9yKCJDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yIik7Ci0JCQl2bS5kaXNhYmxlVmFsaWRhdG9yKCJFYXJWYWxpZGF0b3IiKTsKLQkJCXZtLmVuYWJsZVZhbGlkYXRvcigiV2FyVmFsaWRhdG9yIiwgcHJvamVjdCwgdHJ1ZSwgZmFsc2UpOwotCQkJdm0uZGlzYWJsZVZhbGlkYXRvcigiRUpCVmFsaWRhdG9yIiwgcHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBXaGV0aGVyIHRoaXMgdGVzdCBjYXNlIGZhaWxzIG9yIG5vdCwgc2VuZCBpdHMgcmVzdWx0cyB0byB0aGUgbG9nLgotCQkJZ2V0QnVmZmVyKCkuZGVsaW5lYXRlKF90bWQuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTdkYTUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUJ1bmRsZS1OYW1lLjAgPSBUZXN0Y2FzZXMgZm9yIFZhbGlkYXRpb24gRnJhbWV3b3JrCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDJjMDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBWYWxpZGF0aW9uIENvbnRyaWJ1dGlvbnMgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIFZhbGlkYXRpb24gZXh0ZW5zaW9uIHBvaW50cyAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InRlc3QiIG5hbWU9InZhbGlkYXRvciB0ZXN0Ii8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ0ZXN0U2V0dXAiIG5hbWU9InRlc3RTZXR1cCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ib3BUZXN0IiBuYW1lPSJvcGVyYXRpb24gdGVzdCIvPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgIEpVbml0IEJWVCBUZXN0IFN1aXRlICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3Iuc3VpdGVzIj4KLSAgICAgIDxzdWl0ZQotICAgICAgICAgICAgbmFtZT0iVmFsaWRhdGlvbiBCVlQgU3VpdGUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdC5CVlRTdWl0ZSI+Ci0gICAgICA8L3N1aXRlPgotICAgPC9leHRlbnNpb24+Ci08IS0tIGJhdGNoIEJWVCAtLT4KLSAgPCEtLSA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iYnZ0X2JhdGNoIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPgotICAgICAgPGFwcGxpY2F0aW9uPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvbkJhdGNoIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9hcHBsaWNhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPiAtLT4KLSAgIAotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gQnVpbGRlciAodXNlZCBvbmx5IGZvciBCVlQgdGVzdCBpbnB1dCkgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImJ2dGJ1aWxkZXIiCi0gICAgICAgICBuYW1lPSJWYWxpZGF0aW9uIEJWVCBUZXN0IEJ1aWxkZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuYnVpbGRlcnMiPgotICAgICAgPGJ1aWxkZXI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2suVGVzdE9wQ29uc3RyQnVpbGRlciI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvYnVpbGRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgRldLIFRlc3QgVmFsaWRhdG9ycyAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBUaGVzZSB2YWxpZGF0b3JzIG11c3Qgbm90IGJlIGVuYWJsZWQgYnkgZGVmYXVsdCBvciBzb21lICAgICAtLT4KLTwhLS0gb3RoZXIgQlZUIHRlc3QgY2FzZXMgKGUuZy4gajJlZSkgd2lsbCBmYWlsIGJlY2F1c2UgICAgICAgICAgLS0+Ci08IS0tIG1lc3NhZ2VzIHdpbGwgZXhpc3QgaW4gdGhlIHRhc2sgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gCi0gICAgICAgVGhlIEZXS1Rlc3RWYWxpZGF0b3Igc3VwcG9ydHMgZnVsbCB2YWxpZGF0aW9uLCBhbmQgbWFudWFsIAotICAgICAgIGluY3JlbWVudGFsIGJ1aWxkIHZhbGlkYXRpb24sIGJ1dCBub3QgYXV0b21hdGljIGluY3JlbWVudGFsIAotICAgICAgIGJ1aWxkIHZhbGlkYXRpb24uIAotICAgIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkZ3a1Rlc3RWYWxpZGF0b3IiCi0gICAgICAgICBuYW1lPSJWRiBUZXN0IFZhbGlkYXRvciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotICAgICAgPHZhbGlkYXRvcj4KLSAgICAgICAgIDxwcm9qZWN0TmF0dXJlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSI+Ci0gICAgICAgICA8L3Byb2plY3ROYXR1cmU+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSIqLmphdmEiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8aGVscGVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkZ3a1Rlc3RIZWxwZXIiPgotICAgICAgICAgPC9oZWxwZXI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBlbmFibGVkPSJmYWxzZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuRndrVGVzdFZhbGlkYXRvciIKLSAgICAgICAgICAgICAgIGluY3JlbWVudGFsPSJmYWxzZSI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci08IS0tIAotICAgICAgIFRoZSBGV0tOb0J1aWxkVGVzdFZhbGlkYXRvciBzdXBwb3J0cyBmdWxsIHZhbGlkYXRpb24sIGFuZCBkb2VzIG5vdAotICAgICAgIHN1cHBvcnQgYW55IGJ1aWxkIHZhbGlkYXRpb24uIAotICAgIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkZ3a05vQnVpbGRUZXN0VmFsaWRhdG9yIgotICAgICAgICAgbmFtZT0iVkYgTm9CdWlsZCBUZXN0IFZhbGlkYXRvciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotICAgICAgPHZhbGlkYXRvcj4KLSAgICAgICAgIDxwcm9qZWN0TmF0dXJlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSI+Ci0gICAgICAgICA8L3Byb2plY3ROYXR1cmU+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSIqLmphdmEiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8aGVscGVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkZ3a05vQnVpbGRUZXN0SGVscGVyIj4KLSAgICAgICAgIDwvaGVscGVyPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgZnVsbEJ1aWxkPSJmYWxzZSIKLSAgICAgICAgICAgICAgIGVuYWJsZWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvci5Gd2tOb0J1aWxkVGVzdFZhbGlkYXRvciIKLSAgICAgICAgICAgICAgIGluY3JlbWVudGFsPSJmYWxzZSI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBGd2sgVGVzdCBWYWxpZGF0b3IgQlZUIHRlc3Qgc2V0dXAgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iRndrVGVzdFZhbGlkYXRvckJWVF90ZXN0U2V0dXAiCi0gICAgICAgICBuYW1lPSJGd2sgVGVzdCBWYWxpZGF0b3IgQlZUIFRlc3RTZXR1cCIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnRlc3RTZXR1cCI+Ci0gICAgICA8aW1wb3J0Ci0gICAgICAgICAgICBpbnB1dD0iRldLL0JWVC9vcENvbnN0ci5qYXIiCi0gICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSkFSSW1wb3J0T3BlcmF0aW9uIj4KLSAgICAgIDwvaW1wb3J0PgotICAgPC9leHRlbnNpb24+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSAgICAgICAgICAgICAgIFZpc2libGUgRnJhbWV3b3JrIEJWVCB0ZXN0cyAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iVGVzdE9wQ29uc3RydWN0b3JzIgotICAgICAgICAgbmFtZT0iVGVzdCBPcGVyYXRpb24gQ29uc3RydWN0b3JzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Qub3BUZXN0Ij4KLSAgICAgIDxvcHRlc3QKLSAgICAgICAgICAgIGlucHV0PSJGV0svQlZUL29wQ29uc3RyLmphciIKLSAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2suVGVzdE9wQ29uc3RyT3BlcmF0aW9uIgotICAgICAgICAgICAgcHJvamVjdD0ib3BDb25zdHIiCi0gICAgICAgICAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgICA8L29wdGVzdD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLTxleHRlbnNpb24KLSAgICAgICAgIGlkPSJWQUxGV0swMiIKLSAgICAgICAgIG5hbWU9IlZBTEZXSzAyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Qub3BUZXN0Ij4KLSAgICAgIDxvcHRlc3QKLSAgICAgICAgICAgIGlucHV0PSJGV0svQlZUL29wQ29uc3RyLmphciIKLSAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2suVkFMRldLMDJPcGVyYXRpb24iCi0gICAgICAgICAgICBwcm9qZWN0PSJvcENvbnN0ciIKLSAgICAgICAgICAgIHZpc2libGU9ImZhbHNlIj4KLSAgICAgIDwvb3B0ZXN0PgotICAgPC9leHRlbnNpb24+LS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSAgICAgICAgICAgICAgIEZ3ayBUZXN0IFZhbGlkYXRvciBCVlQgdGVzdHMgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gTm9uZSBvZiB0aGVzZSB0ZXN0cyBhcmUgdmlzaWJsZSBvbiB0aGUgVGVzdCBDb2xsZWN0b3IgbWVudSAgLS0+Ci08IS0tIEluc3RlYWQsIHRoZXNlIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIFZBTEZXSzAyIGFuZCAgICAgICAgIC0tPgotPCEtLSBUZXN0T3BDb25zdHIgdGVzdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iRndrVGVzdFZhbGlkYXRvckJWVCIKLSAgICAgICAgIG5hbWU9IkZ3ayBUZXN0IFZhbGlkYXRvciBCVlQgVGVzdHMiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC50ZXN0Ij4KLSAgICAgIDx0ZXN0Ci0gICAgICAgICAgICBpbnB1dD0iRldLL0JWVC9vcENvbnN0ci5qYXIiCi0gICAgICAgICAgICB2YWxpZGF0b3I9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvci5Gd2tUZXN0VmFsaWRhdG9yIgotICAgICAgICAgICAgcHJvamVjdD0ib3BDb25zdHIiCi0gICAgICAgICAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEiCi0gICAgICAgICAgICAgICBwcmVmaXg9IiIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJJVGVzdC5qYXZhIgotICAgICAgICAgICAgICAgdGV4dD0iVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCByZXBvcnRlZCBieSBWRiBUZXN0IFZhbGlkYXRvci4gUGxlYXNlIGlnbm9yZS4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxIgotICAgICAgICAgICAgICAgcHJlZml4PSIiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0iVGVzdDEuamF2YSIKLSAgICAgICAgICAgICAgIHRleHQ9IlRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaywgcmVwb3J0ZWQgYnkgVkYgVGVzdCBWYWxpZGF0b3IuIFBsZWFzZSBpZ25vcmUuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InRlc3QyL0lUZXN0Mi5qYXZhIgotICAgICAgICAgICAgICAgdGV4dD0iVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCByZXBvcnRlZCBieSBWRiBUZXN0IFZhbGlkYXRvci4gUGxlYXNlIGlnbm9yZS4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxIgotICAgICAgICAgICAgICAgcHJlZml4PSIiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0idGVzdDIvVGVzdDIuamF2YSIKLSAgICAgICAgICAgICAgIHRleHQ9IlRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaywgcmVwb3J0ZWQgYnkgVkYgVGVzdCBWYWxpZGF0b3IuIFBsZWFzZSBpZ25vcmUuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgIDwvdGVzdD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkZ3a05vQnVpbGRUZXN0VmFsaWRhdG9yQlZUIgotICAgICAgICAgbmFtZT0iRndrIE5vQnVpbGQgVGVzdCBWYWxpZGF0b3IgQlZUIFRlc3RzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QudGVzdCI+Ci0gICAgICA8dGVzdAotICAgICAgICAgICAgaW5wdXQ9IkZXSy9CVlQvb3BDb25zdHIuamFyIgotICAgICAgICAgICAgdmFsaWRhdG9yPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuRndrTm9CdWlsZFRlc3RWYWxpZGF0b3IiCi0gICAgICAgICAgICBwcm9qZWN0PSJvcENvbnN0ciIKLSAgICAgICAgICAgIHZpc2libGU9ImZhbHNlIj4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9IklUZXN0LmphdmEiCi0gICAgICAgICAgICAgICB0ZXh0PSJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIHJlcG9ydGVkIGJ5IFZGIE5vQnVpbGQgVGVzdCBWYWxpZGF0b3IuIFBsZWFzZSBpZ25vcmUuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9IlRlc3QxLmphdmEiCi0gICAgICAgICAgICAgICB0ZXh0PSJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIHJlcG9ydGVkIGJ5IFZGIE5vQnVpbGQgVGVzdCBWYWxpZGF0b3IuIFBsZWFzZSBpZ25vcmUuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InRlc3QyL0lUZXN0Mi5qYXZhIgotICAgICAgICAgICAgICAgdGV4dD0iVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCByZXBvcnRlZCBieSBWRiBOb0J1aWxkIFRlc3QgVmFsaWRhdG9yLiBQbGVhc2UgaWdub3JlLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEiCi0gICAgICAgICAgICAgICBwcmVmaXg9IiIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJ0ZXN0Mi9UZXN0Mi5qYXZhIgotICAgICAgICAgICAgICAgdGV4dD0iVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCByZXBvcnRlZCBieSBWRiBOb0J1aWxkIFRlc3QgVmFsaWRhdG9yLiBQbGVhc2UgaWdub3JlLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICA8L3Rlc3Q+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJQcm9wZXJ0aWVzVmFsaWRhdG9yQlZUIgotICAgICAgICAgbmFtZT0iUHJvcGVydGllcyBWYWxpZGF0b3IgQlZUIFRlc3RzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QudGVzdCI+Ci0gICAgICA8dGVzdAotICAgICAgICAgICAgaW5wdXQ9IkZXSy9CVlQvb3BDb25zdHIuamFyIgotICAgICAgICAgICAgdmFsaWRhdG9yPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuUHJvcGVydGllc1ZhbGlkYXRvciIKLSAgICAgICAgICAgIHByb2plY3Q9Im9wQ29uc3RyIgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIzIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDAwMCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwMDBFOiBNYXRjaCB0aGUgYnJhY2VzIGluIHRoZSBtZXNzYWdlLiBUaGVyZSBhcmUgMCB7IGFuZCAxIH0uIE1lc3NhZ2VGb3JtYXQgd2lsbCB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gdGhlcmUgYXJlIG1pc21hdGNoaW5nIGJyYWNlcy4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIyIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDAwMCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwMDBFOiBNYXRjaCB0aGUgYnJhY2VzIGluIHRoZSBtZXNzYWdlLiBUaGVyZSBhcmUgMSB7IGFuZCAwIH0uIE1lc3NhZ2VGb3JtYXQgd2lsbCB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gdGhlcmUgYXJlIG1pc21hdGNoaW5nIGJyYWNlcy4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDAwMCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwMDBFOiBNYXRjaCB0aGUgYnJhY2VzIGluIHRoZSBtZXNzYWdlLiBUaGVyZSBhcmUgMCB7IGFuZCAxIH0uIE1lc3NhZ2VGb3JtYXQgd2lsbCB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gdGhlcmUgYXJlIG1pc21hdGNoaW5nIGJyYWNlcy4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxMCIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwMTAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDEwRTogQ2hhbmdlIGFyZ3VtZW50ICh7LTF9KSB0byBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgOSBpbmNsdXNpdmUgaW4gdGhlIG1lc3NhZ2UuIE1lc3NhZ2VGb3JtYXQgY2Fubm90IHByb2Nlc3MgYW4gaW50ZWdlciBwYXJhbWV0ZXIgdGhhdCBpcyBsZXNzIHRoYW4gMC4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSI4IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDAxMCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwMTBXOiBDaGFuZ2UgYXJndW1lbnQgKHsxMH0pIHRvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA5IGluY2x1c2l2ZSBpbiB0aGUgbWVzc2FnZS4gTWVzc2FnZUZvcm1hdCBpZ25vcmVzIGFueSBwYXJhbWV0ZXJzIGxhcmdlciB0aGFuIDkuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iNyIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwMTAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDEwVzogQ2hhbmdlIGFyZ3VtZW50ICh7MTB9KSB0byBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgOSBpbmNsdXNpdmUgaW4gdGhlIG1lc3NhZ2UuIE1lc3NhZ2VGb3JtYXQgaWdub3JlcyBhbnkgcGFyYW1ldGVycyBsYXJnZXIgdGhhbiA5LiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEyIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDAyMCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwMjBJOiBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlciB7MH0gZnJvbSB0aGUgbWVzc2FnZS4gTWFrZSBtZXNzYWdlcyBzdWNjaW5jdC4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxMyIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwMzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDMwSTogQ2hlY2sgdGhhdCBhcmd1bWVudCB7MX0gd2FzIG9taXR0ZWQgZnJvbSB0aGUgbWVzc2FnZSBkZWxpYmVyYXRlbHkuIElmIGl0IHdhcyBvbWl0dGVkIGFjY2lkZW50YWxseSwgYW5kIHRoZSBjb2RlIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIHBhcmFtZXRlcnMsIE1lc3NhZ2VGb3JtYXQgd2lsbCB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjgiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDMwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDAzMEk6IENoZWNrIHRoYXQgYXJndW1lbnQgezB9IHdhcyBvbWl0dGVkIGZyb20gdGhlIG1lc3NhZ2UgZGVsaWJlcmF0ZWx5LiBJZiBpdCB3YXMgb21pdHRlZCBhY2NpZGVudGFsbHksIGFuZCB0aGUgY29kZSBkb2VzIG5vdCBwcm92aWRlIGVub3VnaCBwYXJhbWV0ZXJzLCBNZXNzYWdlRm9ybWF0IHdpbGwgdGhyb3cgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxNCIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNDAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDQwSTogVXNlIHR3byBhcG9zdHJvcGhlcyBpbiB0aGUgbWVzc2FnZSBhdCBjb2x1bW4gNTcuIE1lc3NhZ2VGb3JtYXQgcmVtb3ZlcyBzaW5nbGUgYXBvc3Ryb3BoZXM7IGZvciB0aGUgbWVzc2FnZSB0byBkaXNwbGF5IGFuIGFwb3N0cm9waGUsIHR3byBhcG9zdHJvcGhlcyBtdXN0IGV4aXN0IGluIHRoZSBzdHJpbmcuIChBbiBhcG9zdHJvcGhlIGlzIGEgcmVzZXJ2ZWQgY2hhcmFjdGVyIG9mIE1lc3NhZ2VGb3JtYXQuKSI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjE1IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA1MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNTBJOiBVc2Ugb25lIGFwb3N0cm9waGUgaW4gdGhlIG1lc3NhZ2UgYXQgY29sdW1uIDU3LiBNZXNzYWdlRm9ybWF0IHByb2Nlc3NlcyBvbmx5IG1lc3NhZ2VzIHdpdGggcGFyYW1ldGVyczsgd2l0aG91dCBNZXNzYWdlRm9ybWF0LCB0aGUgZXh0cmEgYXBvc3Ryb3BoZSB3aWxsIG5vdCBiZSByZW1vdmVkLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjI1IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA2MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNjBXOiBNYWtlIFpfRFVQTElDQVRFIHVuaXF1ZS4gV2hlbiBhbiBpZCBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIGEgZmlsZSwgUmVzb3VyY2VCdW5kbGUgd2lsbCB1c2UgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IG1lc3NhZ2UgaWQuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMjQiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDYwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA2MFc6IE1ha2UgWl9EVVBMSUNBVEUgdW5pcXVlLiBXaGVuIGFuIGlkIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UgaW4gYSBmaWxlLCBSZXNvdXJjZUJ1bmRsZSB3aWxsIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgbWVzc2FnZSBpZC4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxOSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNjAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDYwVzogTWFrZSBEVVBMSUNBVEVfSUQgdW5pcXVlLiBXaGVuIGFuIGlkIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UgaW4gYSBmaWxlLCBSZXNvdXJjZUJ1bmRsZSB3aWxsIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgbWVzc2FnZSBpZC4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxOCIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNjAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDYwVzogTWFrZSBEVVBMSUNBVEVfSUQgdW5pcXVlLiBXaGVuIGFuIGlkIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UgaW4gYSBmaWxlLCBSZXNvdXJjZUJ1bmRsZSB3aWxsIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgbWVzc2FnZSBpZC4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIyOCIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNjAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDYwVzogTWFrZSBaX0RVUExJQ0FURSB1bmlxdWUuIFdoZW4gYW4gaWQgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIGZpbGUsIFJlc291cmNlQnVuZGxlIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBtZXNzYWdlIGlkLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjQzIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA3MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNzBXOiBBQkNEMDAwMEUgbWF5IG5lZWQgdG8gYmUgdW5pcXVlLiBDb252ZW50aW9uYWxseSwgYSBtZXNzYWdlIHByZWZpeCBhcHBsaWVzIHRvIG9ubHkgb25lIGVycm9yIGNvbmRpdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSI0MiIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDcwVzogQUJDRDAwMDBFIG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iNDEiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDcwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA3MFc6IEFCQ0QwMDAwRSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjM5IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA3MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNzBXOiBBQkNEMDAwMEUgbWF5IG5lZWQgdG8gYmUgdW5pcXVlLiBDb252ZW50aW9uYWxseSwgYSBtZXNzYWdlIHByZWZpeCBhcHBsaWVzIHRvIG9ubHkgb25lIGVycm9yIGNvbmRpdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIzOCIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDcwVzogQUJDRDAwMDBFIG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMzciCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDcwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA3MFc6IEFCQ0QwMDAwRSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjM2IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA3MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNzBXOiBBQkNEMDAwMEUgbWF5IG5lZWQgdG8gYmUgdW5pcXVlLiBDb252ZW50aW9uYWxseSwgYSBtZXNzYWdlIHByZWZpeCBhcHBsaWVzIHRvIG9ubHkgb25lIGVycm9yIGNvbmRpdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSI0NSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDcwVzogQUJDRDAwMDBFIG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iNDQiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDcwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA3MFc6IEFCQ0QwMDAwRSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjM1IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA3MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNzBXOiBBQkNEMDAwMEUgbWF5IG5lZWQgdG8gYmUgdW5pcXVlLiBDb252ZW50aW9uYWxseSwgYSBtZXNzYWdlIHByZWZpeCBhcHBsaWVzIHRvIG9ubHkgb25lIGVycm9yIGNvbmRpdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIyMyIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDcwVzogQUFBQTAwMDBXIG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMjAiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDcwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA3MFc6IEFBQUEwMDAwVyBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjIxIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA4MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwODBFOiBGaXggdGhlIHN5bnRheCBlcnJvcjsgZWFjaCBsaW5lIG11c3QgZm9ybSBNRVNTQUdFX0lEID0gTUVTU0FHRS4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxNyIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwODAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDgwRTogRml4IHRoZSBzeW50YXggZXJyb3I7IGVhY2ggbGluZSBtdXN0IGZvcm0gTUVTU0FHRV9JRCA9IE1FU1NBR0UuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAxMTAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMTEwSTogQWRkIGEgdGVybWluYXRpbmcgYXBvc3Ryb3BoZSBhdCBjb2x1bW4gMzYuIFRoZSB7IGFuZCB9IGNoYXJhY3RlcnMgbXVzdCBiZSBlbmNsb3NlZCBpbiBhcG9zdHJvcGhlcy4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgPC90ZXN0PgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIAotICAgCi0gICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMmJhOGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0LiAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAgICAgICAgICAgLS0+Ci0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uIi8+IC0tPgotCi0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIFNldCB0aGUgZW52aXJvbm1lbnQgcHJvcGVydGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIKLSAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMi4wL2xpYnJhcnkueG1sIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9Ii1YbXg3MDBNIi8+Ci0KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIFRoaXMgdGFyZ2V0IGluaXRpYWxpemVzIGFsbCBvZiB0aGUgdGVzdHMgdGhhdCB3aWxsIHJ1bi4gICAgICAgLS0+Ci0gIDwhLS0gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSAtLT4gCi0gIDwhLS0gYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgPHRzdGFtcC8+Ci0gICAgICA8ZGVsZXRlPgotICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcuKi54bWwiLz4KLSAgICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gcnVuLiAgICAgICAgICAgICAgLS0+Ci0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLQk8cHJvcGVydHkgbmFtZT0id29ya3NwYWNlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pzdF9mb2xkZXIiLz4KLQk8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotCTxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIAk8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgIAk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgCTxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0LkF1dG9tYXRlZFZhbGlkYXRpb25CVlQiLz4KLSAgIAkgIAk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgCSAgCTxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+Ci0JPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgIC0tPgotICA8IS0tIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gICAgICAgLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuICAgICAgICAgICAgICAgIC0tPgotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZy4qLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9hcGkvdGVzdC9BcGlUZXN0c1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vYXBpL3Rlc3QvQXBpVGVzdHNTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTA2N2UwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9hcGkvdGVzdC9BcGlUZXN0c1N1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLmFwaS50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFwaVRlc3RzU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCQotCSBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLQkgICAgICAgIHJldHVybiBuZXcgQXBpVGVzdHNTdWl0ZSgpOwotCSAgICB9Ci0KLQlwdWJsaWMgQXBpVGVzdHNTdWl0ZSgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkVGVzdChWYWxpZGF0aW9uUmVnaXN0cnlBcGlUZXN0LnN1aXRlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL2FwaS90ZXN0L1ZhbGlkYXRpb25SZWdpc3RyeUFwaVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9hcGkvdGVzdC9WYWxpZGF0aW9uUmVnaXN0cnlBcGlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTk3ZjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL2FwaS90ZXN0L1ZhbGlkYXRpb25SZWdpc3RyeUFwaVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uYXBpLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuVmFsaWRhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblJlZ2lzdHJ5QXBpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFZhbGlkYXRpb25SZWdpc3RyeUFwaVRlc3QuY2xhc3MpOwotCX0gCi0KLQlwdWJsaWMgVmFsaWRhdGlvblJlZ2lzdHJ5QXBpVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVmFsaWRhdGlvblJlZ2lzdHJ5QXBpVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9nZXRWYWxpZGF0b3IoKSB7Ci0JdHJ5IHsKLQkJVmFsaWRhdGlvbkZhY3RvcnkgdmFsRmFjdG9yeSA9IFZhbGlkYXRpb25GYWN0b3J5Lmluc3RhbmNlOwotCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IHZhbEZhY3RvcnkuZ2V0VmFsaWRhdG9yKCJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIud29ya2JlbmNoLnZhbGlkYXRpb24uVUlFamJWYWxpZGF0b3IiKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwodmFsaWRhdG9yKTsKLQkgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkgIH0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0JWVFZhbGlkYXRpb25CYXRjaC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQlZUVmFsaWRhdGlvbkJhdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZDIyMDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQlZUVmFsaWRhdGlvbkJhdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGxhdGZvcm1SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbC5CVlRSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFZhbGlkYXRpb25VdGlsaXR5OwotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBCVlRWYWxpZGF0aW9uQmF0Y2ggaW1wbGVtZW50cyBJUGxhdGZvcm1SdW5uYWJsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX2RpciA9IG51bGw7IC8vIFRoZSB0ZXN0IGNhc2VzICguZWFyLCAuamFyKSBhcmUgaWRlbnRpZmllZCB0aHJvdWdoIGEgcmVsYXRpdmUgZGlyZWN0b3J5LCBhbmQgdGhpcyBpcyB0aGUgcGFyZW50IG9mIHRoYXQgcmVsYXRpdmUgZGlyZWN0b3J5LgotCXByaXZhdGUgYm9vbGVhbiBfdmVyYm9zZSA9IGZhbHNlOwotCXN0YXRpYyBCb29sZWFuIF9wYXNzZWQgPSBudWxsOwotCQotCWJvb2xlYW4gaXNWZXJib3NlKCkgewotCQlyZXR1cm4gX3ZlcmJvc2U7Ci0JfQotCQotCXZvaWQgc2V0VmVyYm9zZShib29sZWFuIHYpIHsKLQkJX3ZlcmJvc2UgPSB2OwotCX0KLQkKLQlTdHJpbmcgZ2V0RGlyKCkgewotCQlyZXR1cm4gX2RpcjsKLQl9Ci0JCi0Jdm9pZCBzZXREaXIoU3RyaW5nIGRpcikgewotCQlfZGlyID0gZGlyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGFyc2VVc2VyU2V0dGluZ3MoT2JqZWN0IGFyZ3MpIHsKLQkJaWYoYXJncyA9PSBudWxsKSB7Ci0JCQkvLyBub3RoaW5nIHRvIHNldAotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZihhcmdzIGluc3RhbmNlb2YgU3RyaW5nW10pIHsKLQkJCVN0cmluZ1tdIHVzZXJTZXR0aW5ncyA9IChTdHJpbmdbXSlhcmdzOwotCQkJaWYodXNlclNldHRpbmdzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlmb3IoaW50IGk9MDsgaTx1c2VyU2V0dGluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZih1c2VyU2V0dGluZ3NbaV0uZXF1YWxzKCItZGlyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlzZXREaXIodXNlclNldHRpbmdzW2krMV0pOwotCQkJCX0KLQkJCQkKLQkJCQlpZih1c2VyU2V0dGluZ3NbaV0uZXF1YWxzKCItdHJhY2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXNldFZlcmJvc2UodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyB0dXJuIG9uIGZyYW1ld29yayB2YWxpZGF0aW9uIGxvZ2dpbmcKLQkJCWlmKGlzVmVyYm9zZSgpKSB7Ci0JCQkJQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS5zZXRMZXZlbChMZXZlbC5GSU5FU1QpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBQYXJzZSB0aGUgdXNlcidzIHNldHRpbmdzLCBpbXBvcnQgdGhlIHRlc3QgY2FzZXMsIGFuZCBydW4gdGhlIHRlc3QgY2FzZXMuCi0JICovCi0JcHVibGljIE9iamVjdCBydW4oT2JqZWN0IGFyZ3MpIHRocm93cyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJcGFyc2VVc2VyU2V0dGluZ3MoYXJncyk7Ci0KLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsJCQotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3Iuc3ViVGFzaygiV29ya3NwYWNlIGlzIGxvY2F0ZWQgYXQ6ICIgKyBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCQkJQ29uc29sZUJ1ZmZlciBidWZmZXIgPSBuZXcgQ29uc29sZUJ1ZmZlcigpOwotCQkJCQlCVlRSdW5uZXIuc2luZ2xldG9uKCkuc2V0dXBUZXN0cyhidWZmZXIsIGlzVmVyYm9zZSgpKTsKLQkJCQkJCi0JCQkJCWludCBudW1UZXN0cyA9IEJWVFZhbGlkYXRpb25VdGlsaXR5Lm51bVZhbGlkYXRvclRlc3RzKG1vbml0b3IsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSk7Ci0JCQkJCWludCBudW1QYXNzZWQgPSBCVlRSdW5uZXIuc2luZ2xldG9uKCkudGVzdChidWZmZXIsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSk7Ci0JCQkJCV9wYXNzZWQgPSAoKG51bVBhc3NlZCA9PSBudW1UZXN0cykgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLQkJCQl9Ci0JCQkJY2F0Y2goQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQl0cnkgewotCQkJQ29uc29sZVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IENvbnNvbGVQcm9ncmVzc01vbml0b3IoKTsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG1vbml0b3IpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBuZXcgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbihleGMpOwotCQl9Ci0JCXJldHVybiBfcGFzc2VkOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0JWVFZhbGlkYXRpb25FeGNlcHRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0JWVFZhbGlkYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4MDlkOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CVlRWYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQlwcml2YXRlIFRocm93YWJsZSBfdGFyZ2V0ID0gbnVsbDsKLQkKLQlwdWJsaWMgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgdCkgewotCQlzZXRUYXJnZXRFeGNlcHRpb24odCk7Ci0JfQotCQotCXB1YmxpYyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQkKLQlwdWJsaWMgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIHRhcmdldCkgewotCQlzdXBlcihzKTsKLQkJc2V0VGFyZ2V0RXhjZXB0aW9uKHRhcmdldCk7Ci0JfQotCQotCXB1YmxpYyBUaHJvd2FibGUgZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgewotCQlyZXR1cm4gX3RhcmdldDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RXhjZXB0aW9uKFRocm93YWJsZSB0YXJnZXQpIHsKLQkJX3RhcmdldCA9IHRhcmdldDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CVlRWYWxpZGF0aW9uUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CVlRWYWxpZGF0aW9uUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZDIyZTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQlZUVmFsaWRhdGlvblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5EZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFBsdWdpbiBmb3IgVFZUIHRlc3RpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBCVlRWYWxpZGF0aW9uUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwcml2YXRlIHN0YXRpYyBCVlRWYWxpZGF0aW9uUGx1Z2luIGluc3QgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIFZhbGlkYXRpb25UVlRQbHVnaW4gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gZGVzY3JpcHRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgQlZUVmFsaWRhdGlvblBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdCA9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQlZUVmFsaWRhdGlvblBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBpbnN0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCSAgICByZXR1cm4gUExVR0lOX0lEOwotCX0KLQkKLQlwdWJsaWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpIHsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKSB7Ci0JCQlsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldFBsdWdpbklEKCkpOwotCQkJc2V0UmVuZGVyZXIobG9nZ2VyKTsKLQkJfQotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYUxvZ2dlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJlbmRlcmVyKExvZ2dlciBhTG9nZ2VyKSB7Ci0JCW5ldyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcihhTG9nZ2VyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGU9IGdldFBsdWdpbigpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSE9bnVsbCA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luUmVzb3VyY2UiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCWluc3QgPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCWdldE1zZ0xvZ2dlcigpLmxvZyhlKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIGxvZyhMZXZlbCBzZXZlcmUsIFN0cmluZyBtc2cpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CdWZmZXJlZFRhc2tTdGF0dXMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0J1ZmZlcmVkVGFza1N0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjU0Njg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0J1ZmZlcmVkVGFza1N0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5UZXN0Y2FzZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotCi0KLXB1YmxpYyBjbGFzcyBCdWZmZXJlZFRhc2tTdGF0dXMgZXh0ZW5kcyBUYXNrU3RhdHVzIGltcGxlbWVudHMgSUJ1ZmZlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBfbW9uaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX2xvZ0ZpbGVOYW1lID0gbnVsbDsKLQkKLQlwdWJsaWMgQnVmZmVyZWRUYXNrU3RhdHVzKCkgewotCX0KLQkKLQlwdWJsaWMgQnVmZmVyZWRUYXNrU3RhdHVzKFN0cmluZyBsb2dGaWxlTmFtZSkgewotCQl0aGlzKGxvZ0ZpbGVOYW1lLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIEJ1ZmZlcmVkVGFza1N0YXR1cyhTdHJpbmcgbG9nRmlsZU5hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlfYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JCXNldExvZ0ZpbGVOYW1lKGxvZ0ZpbGVOYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXN1cGVyLmNsZWFyKCk7Ci0JCV9idWZmZXIgPSBudWxsOwotCQlfYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlfbW9uaXRvci5kb25lKCk7Ci0JCV9tb25pdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gX2xvZ0ZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMb2dGaWxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlfbG9nRmlsZU5hbWUgPSBuYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJcmV0dXJuIF9idWZmZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI2dldFByb2dyZXNzTW9uaXRvcigpCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihfbW9uaXRvciA9PSBudWxsKSB7Ci0JCQlfbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIF9tb25pdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtKSB7Ci0JCV9tb25pdG9yID0gbTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjcmVwb3J0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoKSB7Ci0JCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQlfYnVmZmVyLmFwcGVuZCgiPj4+Pj4+Pj4+Pj4+Pj4+PlRFU1QgU1VJVEUgUkVTVUxUUz4+Pj4+Pj4+Pj4+Pj4+Pj4iKTsgLy8kTk9OLU5MUy0xJAotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0KLQkJaWYoZ2V0RWxhcHNlZFRpbWUoKS5zaXplKCkgPiAwKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldEVsYXBzZWRUaW1lKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCWxvbmcgdG90YWwgPSAwOwotCQkJX2J1ZmZlci5hcHBlbmQoIj4+Pj4+Pj4+Pj4+Pj4+Pj5FTEFQU0VEIFRJTUU+Pj4+Pj4+Pj4+Pj4+Pj4+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIHRhc2tOYW1lID0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0JCQkJTG9uZyBlbGFwc2VkVGltZSA9IChMb25nKWdldEVsYXBzZWRUaW1lKCkuZ2V0KHRhc2tOYW1lKTsKLQkJCQl0b3RhbCArPSBlbGFwc2VkVGltZS5sb25nVmFsdWUoKTsKLQkJCQlfYnVmZmVyLmFwcGVuZCgiVG90YWwgZWxhcHNlZCB0aW1lIG9mIHRhc2sgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlfYnVmZmVyLmFwcGVuZCh0YXNrTmFtZSk7Ci0JCQkJX2J1ZmZlci5hcHBlbmQoIiBpcyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCV9idWZmZXIuYXBwZW5kKGVsYXBzZWRUaW1lKTsKLQkJCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJCX0KLQkJCV9idWZmZXIuYXBwZW5kKCJUb3RhbCB0aW1lIG9mIGFsbCB0YXNrcyBpcyAiICsgdG90YWwgKyAiLCB3aGljaCBpcyAiICsgKHRvdGFsLzEwMDAvNjApICsgIiBtaW51dGVzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCX0KLQotCQlpbnQgdG90TnVtUGFzcyA9IDA7Ci0JCU1hcCB0YXNrU3RhdHVzID0gZ2V0VGFza1N0YXR1cygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHRhc2tTdGF0dXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCV9idWZmZXIuYXBwZW5kKCI+Pj4+Pj4+Pj4+Pj4+Pj4+UEFTUy9GQUlMIFNVTU1BUlk+Pj4+Pj4+Pj4+Pj4+Pj4+Iik7IC8vJE5PTi1OTFMtMSQKLQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHRhc2tOYW1lID0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0JCQlUZXN0U3RhdHVzIHRzID0gKFRlc3RTdGF0dXMpdGFza1N0YXR1cy5nZXQodGFza05hbWUpOwotCQkJX2J1ZmZlci5hcHBlbmQodHMpOwotCQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCQlpZih0cy5pc1N1Y2Nlc3NmdWwoKSkgewotCQkJCXRvdE51bVBhc3MrKzsKLQkJCX0KLQkJfQotCQkKLQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQlfYnVmZmVyLmFwcGVuZCgiVG90YWwgTnVtYmVyIE9mIFRlc3RzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlfYnVmZmVyLmFwcGVuZChudW1UZXN0cygpKTsKLQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCV9idWZmZXIuYXBwZW5kKCJOdW1iZXIgUGFzc2VkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlfYnVmZmVyLmFwcGVuZCh0b3ROdW1QYXNzKTsKLQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCQotCQlpZihnZXRMb2dGaWxlTmFtZSgpICE9IG51bGwpIHsKLQkJCV9idWZmZXIuYXBwZW5kKCJUaGlzIHJlcG9ydCBpcyBzdG9yZWQgaW4gdGhlIGZvbGxvd2luZyBsb2cgZmlsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJCV9idWZmZXIuYXBwZW5kKGdldExvZ0ZpbGVOYW1lKCkpOwotCQotCQkJVGVzdGNhc2VVdGlsaXR5LmZsdXNoKGdldExvZ0ZpbGVOYW1lKCksIF9idWZmZXIudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjZGVsaW5lYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxpbmVhdGUoU3RyaW5nIHRlc3RjYXNlTmFtZSkgewotCQlUYXNrU3RhdHVzLiBUZXN0U3RhdHVzIHRzID0gZ2V0VGVzdFN0YXR1cyh0ZXN0Y2FzZU5hbWUpOwotCQlpZih0cyA9PSBudWxsKSB7Ci0JCQkvLyBub3RoaW5nIHRvIHJlcG9ydAotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBlcnJvcnNCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWVycm9yc0J1ZmZlci5hcHBlbmQodHMubnVtRmFpbHVyZSgpKTsKLQkJZXJyb3JzQnVmZmVyLmFwcGVuZCgiIGVycm9ycyB3ZXJlIHJlcG9ydGVkIGFuZCAiKTsgLy8kTk9OLU5MUy0xJAotCQllcnJvcnNCdWZmZXIuYXBwZW5kKHRzLm51bVdhcm5pbmdzKCkpOwotCQllcnJvcnNCdWZmZXIuYXBwZW5kKCIgd2FybmluZ3Mgd2VyZSByZXBvcnRlZC4gUmVhZCAiKTsgLy8kTk9OLU5MUy0xJAotCQllcnJvcnNCdWZmZXIuYXBwZW5kKGdldExvZ0ZpbGVOYW1lKCkpOwotCQllcnJvcnNCdWZmZXIuYXBwZW5kKCIgZm9yIGRldGFpbHMuIik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGUoZXJyb3JzQnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciN3cml0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCS8vIENhbid0IHdyaXRlIHRvIHRoZSBKVW5pdCBsb2cuIENhbiBvbmx5IHdyaXRlIHRvIHRoZSBsb2cgYnkgZmFpbGluZyB0aGUKLQkJLy8gdGVzdCBjYXNlIHdpdGggYSBtZXNzYWdlOyBpbnN0ZWFkLCB3cml0ZSB0byB0aGUgYnVmZmVyLCBhbmQgc2VuZCB0aGlzCi0JCS8vIGluZm9ybWF0aW9uIHRvIGEgbG9nIGluIHRoZSB2YWxpZGF0aW9uLnRlc3QgcGx1Z2luJ3Mgc3RhdGUgbG9jYXRpb24uCi0JCV9idWZmZXIuYXBwZW5kKG1lc3NhZ2UpOwotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CdWlsZEluZm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0J1aWxkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzJjNmVmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0J1aWxkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7Ci1wdWJsaWMgY2xhc3MgQnVpbGRJbmZvIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIkxpY2Vuc2VkIE1hdGVyaWFscyAtLSBQcm9wZXJ0eSBvZiBJQk1cbihjKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgMjAwMSwyMDAzXG5VUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnQnVpbGRMZXZlbCA9ICIyMDAzMTExMl8xOTE1LVdCMjEyLUFELVY1MTFELVc1IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NBQnVpbGRMZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQ29uc29sZUJ1ZmZlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQ29uc29sZUJ1ZmZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhiZGNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0NvbnNvbGVCdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLQotLyoqCi0gKiBTZW5kcyB0aGUgVGVzdENhc2VHZW5lcmF0b3JPcGVyYXRpb24gb3V0cHV0IHRvIFN5c3RlbS5vdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zb2xlQnVmZmVyIGltcGxlbWVudHMgSUJ1ZmZlciB7Ci0JcHJpdmF0ZSBCdWZmZXJlZFRhc2tTdGF0dXMgX3N0YXR1cyA9IG51bGw7Ci0JCi0JcHVibGljIENvbnNvbGVCdWZmZXIoKSB7Ci0JCV9zdGF0dXMgPSBuZXcgQnVmZmVyZWRUYXNrU3RhdHVzKCk7IC8vIG5vIGxvZyBmaWxlCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjcmVwb3J0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoKSB7Ci0JCV9zdGF0dXMucmVwb3J0KCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihfc3RhdHVzLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlfc3RhdHVzLmNsZWFyKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9nRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBfc3RhdHVzLmdldExvZ0ZpbGVOYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI2RlbGluZWF0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGluZWF0ZShTdHJpbmcgdGFza05hbWUpIHsKLQkJX3N0YXR1cy5kZWxpbmVhdGUodGFza05hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNnZXRQcm9ncmVzc01vbml0b3IoKQotCSAqLwotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIF9zdGF0dXMuZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI3dyaXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3N0YXR1cy53cml0ZShtZXNzYWdlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2FkZEVsYXBzZWRUaW1lKGphdmEubGFuZy5TdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxhcHNlZFRpbWUoU3RyaW5nIHRhc2tOYW1lLCBsb25nIGVsYXBzZWRUaW1lKSB7Ci0JCV9zdGF0dXMuYWRkRWxhcHNlZFRpbWUodGFza05hbWUsIGVsYXBzZWRUaW1lKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2FkZEV4ZWN1dGlvblN0YXR1cyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RjYXNlTmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBpbnQgcGFzc09yRmFpbCwgSUJ1ZmZlciBidWZmZXIsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9zdGF0dXMuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3RjYXNlTmFtZSwgc3ViVGFza05hbWUsIHBhc3NPckZhaWwsIGJ1ZmZlciwgbWVzc2FnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNhZGRHbG9iYWxFeGVjdXRpb25TdGF0dXMoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdFBhc3NOYW1lLCBib29sZWFuIHBhc3MpIHsKLQkJX3N0YXR1cy5hZGRFeGVjdXRpb25TdGF0dXModGVzdFBhc3NOYW1lLCBwYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RQYXNzTmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBib29sZWFuIHBhc3MpIHsKLQkJX3N0YXR1cy5hZGRFeGVjdXRpb25TdGF0dXModGVzdFBhc3NOYW1lLCBzdWJUYXNrTmFtZSwgcGFzcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNpc1N1Y2Nlc3NmdWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bCgpIHsKLQkJcmV0dXJuIF9zdGF0dXMuaXNTdWNjZXNzZnVsKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNpc1N1Y2Nlc3NmdWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJcmV0dXJuIF9zdGF0dXMuaXNTdWNjZXNzZnVsKHRlc3ROYW1lKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjc2V0UHJvZ3Jlc3NNb25pdG9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJX3N0YXR1cy5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQ29uc29sZVByb2dyZXNzTW9uaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQ29uc29sZVByb2dyZXNzTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQ5ZjZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0NvbnNvbGVQcm9ncmVzc01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIFRoaXMgcHJvZ3Jlc3MgbW9uaXRvciBkaXJlY3RzIGFsbCB0YXNrIGluZm9ybWF0aW9uIHRvIHN0ZC5vdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zb2xlUHJvZ3Jlc3NNb25pdG9yIGltcGxlbWVudHMgSVByb2dyZXNzTW9uaXRvciB7Ci0JcHJpdmF0ZSBpbnQgX3RvdGFsV29yayA9IDA7Ci0JcHJpdmF0ZSBpbnQgX3dvcmtEb25lU29GYXIgPSAwOwotCXByaXZhdGUgYm9vbGVhbiBfY2FuY2VsUmVxdWVzdGVkID0gZmFsc2U7Ci0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2JlZ2luVGFzayhTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLQkJX3RvdGFsV29yayA9IHRvdGFsV29yazsKLQkJcmVwb3J0KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjZG9uZSgpCi0JICovCi0JcHVibGljIHZvaWQgZG9uZSgpIHsKLQkJaW50IHdvcmtSZW1haW5pbmcgPSBfdG90YWxXb3JrIC0gX3dvcmtEb25lU29GYXI7Ci0JCXdvcmtlZCh3b3JrUmVtYWluaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2ludGVybmFsV29ya2VkKGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgd29yaykgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJcmV0dXJuIF9jYW5jZWxSZXF1ZXN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNzZXRDYW5jZWxlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJX2NhbmNlbFJlcXVlc3RlZCA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3Ijc2V0VGFza05hbWUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJlcG9ydChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3N1YlRhc2soU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHN1YlRhc2soU3RyaW5nIG5hbWUpIHsKLQkJcmVwb3J0KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3Ijd29ya2VkKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKLQkJX3dvcmtEb25lU29GYXIgKz0gd29yazsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwb3J0KFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9JT3BlcmF0aW9uUnVubmFibGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0lPcGVyYXRpb25SdW5uYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDdiNjZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0lPcGVyYXRpb25SdW5uYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLQotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGludGVyZmFjZSBhcmUgcnVuIGFzIHBhcnQgb2YgdGhlIFRlc3QgQ29sbGVjdG9yIEJWVC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uUnVubmFibGUgZXh0ZW5kcyBJV29ya3NwYWNlUnVubmFibGUgewotCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGIpOwotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcCk7Ci0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdGVzdE5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvVGFza1N0YXR1cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvVGFza1N0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjk4OWQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L1Rhc2tTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzOwotCi0KLS8qKgotICogQWxsIG9mIHRoZSBJQnVmZmVyIGluc3RhbmNlcyBuZWVkIHRvIGJlIGFibGUgdG8gdHJhY2sgZWxhcHNlZCB0aW1lCi0gKiBhbmQgZXhlY3V0aW9uIHN0YXR1cy4gRWFjaCBidWZmZXIgY2FuIGNyZWF0ZSBhbiBpbnRlcm5hbCBpbnN0YW5jZSBvZgotICogdGhpcyBjbGFzcyB0byBwZXJmb3JtIHRob3NlIHRhc2tzLgotICovCi1wdWJsaWMgY2xhc3MgVGFza1N0YXR1cyBpbXBsZW1lbnRzIElUZXN0U3RhdHVzIHsKLQlwcml2YXRlIE1hcCBfZWxhcHNlZFRpbWUgPSBudWxsOwotCXByaXZhdGUgTWFwIF90YXNrU3RhdHVzID0gbnVsbDsKLQotCXB1YmxpYyBUYXNrU3RhdHVzKCkgewotCQlfZWxhcHNlZFRpbWUgPSBuZXcgSGFzaE1hcCgpOwotCQlfdGFza1N0YXR1cyA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI2FkZEVsYXBzZWRUaW1lKFN0cmluZywgbG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbGFwc2VkVGltZShTdHJpbmcgdGFza05hbWUsIGxvbmcgZWxhcHNlZFRpbWUpIHsKLQkJTG9uZyB0aW1lID0gKExvbmcpX2VsYXBzZWRUaW1lLmdldCh0YXNrTmFtZSk7Ci0JCWlmKHRpbWUgPT0gbnVsbCkgewotCQkJdGltZSA9IG5ldyBMb25nKGVsYXBzZWRUaW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCXRpbWUgPSBuZXcgTG9uZyh0aW1lLmxvbmdWYWx1ZSgpICsgZWxhcHNlZFRpbWUpOwotCQl9Ci0JCV9lbGFwc2VkVGltZS5wdXQodGFza05hbWUsIHRpbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRhc2tOYW1lLCBib29sZWFuIHBhc3MpIHsKLQkJYWRkRXhlY3V0aW9uU3RhdHVzKHRhc2tOYW1lLCBudWxsLCBwYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0YXNrTmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBib29sZWFuIHBhc3MpIHsKLQkJaW50IHN1Y2Nlc3MgPSAocGFzcykgPyBJVGVzdFN0YXR1cy5QQVNTIDogSVRlc3RTdGF0dXMuRkFJTDsKLQkJYWRkRXhlY3V0aW9uU3RhdHVzKHRhc2tOYW1lLCBzdWJUYXNrTmFtZSwgc3VjY2VzcywgbnVsbCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgbnVtVGVzdHMoKSB7Ci0JCXJldHVybiBfdGFza1N0YXR1cy5zaXplKCk7Ci0JfQotCQotCXByb3RlY3RlZCBNYXAgZ2V0RWxhcHNlZFRpbWUoKSB7Ci0JCXJldHVybiBfZWxhcHNlZFRpbWU7Ci0JfQotCQotCXByb3RlY3RlZCBNYXAgZ2V0VGFza1N0YXR1cygpIHsKLQkJcmV0dXJuIF90YXNrU3RhdHVzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RjYXNlTmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBpbnQgc2V2ZXJpdHksIElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbWVzc2FnZSkgewotCQlUZXN0U3RhdHVzIHRzID0gZ2V0VGVzdFN0YXR1cyh0ZXN0Y2FzZU5hbWUpOwotCQlpZih0cyA9PSBudWxsKSB7Ci0JCQl0cyA9IG5ldyBUZXN0U3RhdHVzKHRlc3RjYXNlTmFtZSk7Ci0JCQlfdGFza1N0YXR1cy5wdXQodGVzdGNhc2VOYW1lLCB0cyk7Ci0JCX0KLQkJaWYoc3ViVGFza05hbWUgPT0gbnVsbCkgewotCQkJdHMuYWRkRXhlY3V0aW9uU3RhdHVzKHNldmVyaXR5KTsKLQkJfQotCQllbHNlIHsKLQkJCXRzLmFkZEV4ZWN1dGlvblN0YXR1cyhzdWJUYXNrTmFtZSwgc2V2ZXJpdHkpOwotCQl9Ci0KLQkJaWYobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFRlc3RTdGF0dXMgZ2V0VGVzdFN0YXR1cyhTdHJpbmcgdGVzdGNhc2VOYW1lKSB7Ci0JCXJldHVybiAoVGVzdFN0YXR1cylfdGFza1N0YXR1cy5nZXQodGVzdGNhc2VOYW1lKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2lzU3VjY2Vzc2Z1bCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKCkgewotCQlpZihfdGFza1N0YXR1cy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Rhc2tTdGF0dXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgdHNOYW1lID0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0JCQlUZXN0U3RhdHVzIHRzID0gKFRlc3RTdGF0dXMpX3Rhc2tTdGF0dXMuZ2V0KHRzTmFtZSk7Ci0JCQlpZih0cyA9PSBudWxsIHx8ICF0cy5pc1N1Y2Nlc3NmdWwoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJaWYoX3Rhc2tTdGF0dXMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlUZXN0U3RhdHVzIHRzID0gKFRlc3RTdGF0dXMpX3Rhc2tTdGF0dXMuZ2V0KHRlc3ROYW1lKTsKLQkJaWYodHMgPT0gbnVsbCB8fCAhdHMuaXNTdWNjZXNzZnVsKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCV90YXNrU3RhdHVzLmNsZWFyKCk7Ci0JCV9lbGFwc2VkVGltZS5jbGVhcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgY2xhc3MgVGVzdENvdW50IHsKLQkJcHVibGljIGludCBudW1SYW4gPSAwOwotCQlwdWJsaWMgaW50IG51bVdhcm4gPSAwOyAvLyBOdW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyByZXBvcnRlZCBmb3IgYSB0ZXN0IGNhc2UuCi0JCXB1YmxpYyBpbnQgbnVtRmFpbCA9IDA7IC8vIE51bWJlciBvZiBmYWlsdXJlIG1lc3NhZ2VzIHJlcG9ydGVkIGZvciBhIHRlc3QgY2FzZS4KLQkJcHVibGljIGludCBudW1QYXNzID0gMDsgLy8gTnVtYmVyIG9mIHRlc3QgY2FzZXMgdGhhdCBwYXNzZWQuCi0JfQotCi0JLyoqCi0JICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgdHJhY2sgdGhlIG51bWJlciBvZiB0ZXN0IHJ1bnMgYW5kIHRoZSAKLQkgKiBudW1iZXIgb2YgdGVzdCBjYXNlcyB0aGF0IHBhc3MuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFRlc3RTdGF0dXMgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkJcHJpdmF0ZSBTdHJpbmcgX3Rlc3RjYXNlTmFtZSA9IG51bGw7Ci0JCXByaXZhdGUgTWFwIF90ZXN0U3RhdHVzID0gbnVsbDsKLQkJCi0JCS8qKgotCQkgKiBOYW1lIG11c3Qgbm90IGJlIG51bGwuCi0JCSAqLwotCQlwdWJsaWMgVGVzdFN0YXR1cyhTdHJpbmcgbmFtZSkgewotCQkJX3Rlc3RjYXNlTmFtZSA9IG5hbWU7Ci0JCQlfdGVzdFN0YXR1cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgc3ViVGFza05hbWUsIGludCBzZXZlcml0eSkgewotCQkJVGVzdENvdW50IHNvRmFyID0gKFRlc3RDb3VudClfdGVzdFN0YXR1cy5nZXQoc3ViVGFza05hbWUpOwotCQkJaWYoc29GYXIgPT0gbnVsbCkgewotCQkJCXNvRmFyID0gbmV3IFRlc3RDb3VudCgpOwotCQkJfQotCQkJc29GYXIubnVtUmFuKys7Ci0JCQlzd2l0Y2goc2V2ZXJpdHkpIHsKLQkJCQljYXNlKElUZXN0U3RhdHVzLldBUk4pOiB7Ci0JCQkJCXNvRmFyLm51bVdhcm4rKzsKLQkJCQkJc29GYXIubnVtUGFzcysrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJCi0JCQkJY2FzZShJVGVzdFN0YXR1cy5GQUlMKTogewotCQkJCQlzb0Zhci5udW1GYWlsKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQljYXNlKElUZXN0U3RhdHVzLlBBU1MpOiB7Ci0JCQkJCXNvRmFyLm51bVBhc3MrKzsKLQkJCQl9Ci0JCQkJCi0JCQkJZGVmYXVsdDogewotCQkJCQkvLyBjaGFuZ2Ugbm90aGluZwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCV90ZXN0U3RhdHVzLnB1dChzdWJUYXNrTmFtZSwgc29GYXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoaW50IHNldmVyaXR5KSB7Ci0JCQlhZGRFeGVjdXRpb25TdGF0dXMobnVsbCwgc2V2ZXJpdHkpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRlc3RjYXNlTmFtZSgpIHsKLQkJCXJldHVybiBfdGVzdGNhc2VOYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IG51bVdhcm5pbmdzKCkgewotCQkJaW50IG51bVdhcm5pbmdzID0gMDsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Rlc3RTdGF0dXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVRlc3RDb3VudCB0YyA9IChUZXN0Q291bnQpaXRlcmF0b3IubmV4dCgpOwotCQkJCW51bVdhcm5pbmdzICs9IHRjLm51bVdhcm47Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtV2FybmluZ3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgbnVtRmFpbHVyZSgpIHsKLQkJCWludCBudW1GYWlsID0gMDsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Rlc3RTdGF0dXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVRlc3RDb3VudCB0YyA9IChUZXN0Q291bnQpaXRlcmF0b3IubmV4dCgpOwotCQkJCW51bUZhaWwgKz0gdGMubnVtRmFpbDsKLQkJCX0KLQkJCXJldHVybiBudW1GYWlsOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IF90ZXN0U3RhdHVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlUZXN0Q291bnQgdGMgPSAoVGVzdENvdW50KWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZih0Yy5udW1GYWlsICE9IDApIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaW50IHRvdGFsID0gMDsKLQkJCWludCBwYXNzID0gMDsKLQkJCWludCBmYWlsID0gMDsKLQkJCWludCB3YXJuID0gMDsKLQkJCQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdGVzdFN0YXR1cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJVGVzdENvdW50IHRjID0gKFRlc3RDb3VudClpdGVyYXRvci5uZXh0KCk7Ci0JCQkJdG90YWwrKzsKLQkJCQlmYWlsICs9IHRjLm51bUZhaWw7Ci0JCQkJd2FybiArPSB0Yy5udW1XYXJuOwotCQkJCXBhc3MgKz0gdGMubnVtUGFzczsKLQkJCX0KLQkJCQotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0VGVzdGNhc2VOYW1lKCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiIFRvdGFsOiIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHRvdGFsKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIiBbUGFzczogIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQocGFzcyk7Ci0JCQlidWZmZXIuYXBwZW5kKCIgRmFpbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoZmFpbCk7Ci0JCQlidWZmZXIuYXBwZW5kKCIgV2FybjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQod2Fybik7Ci0JCQlidWZmZXIuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZihvIGluc3RhbmNlb2YgVGVzdFN0YXR1cykgewotCQkJCVRlc3RTdGF0dXMgcyA9IChUZXN0U3RhdHVzKW87Ci0JCQkJcmV0dXJuKF90ZXN0Y2FzZU5hbWUuZXF1YWxzKHMuZ2V0VGVzdGNhc2VOYW1lKCkpKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIGdldFRlc3RjYXNlTmFtZSgpLmhhc2hDb2RlKCk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmKCEobzEgaW5zdGFuY2VvZiBUZXN0U3RhdHVzKSAmJiAobzIgaW5zdGFuY2VvZiBUZXN0U3RhdHVzKSkgewotCQkJCS8vIFNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBpZiBpdCBkb2VzLCBzYXkgdGhhdCB0aGVzZSBub24tVGVzdFN0YXR1cyBvYmplY3RzIGFyZSBlcXVhbC4KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotCQkJVGVzdFN0YXR1cyBhID0gKFRlc3RTdGF0dXMpbzE7Ci0JCQlUZXN0U3RhdHVzIGIgPSAoVGVzdFN0YXR1cylvMjsKLQkJCXJldHVybiBhLmdldFRlc3RjYXNlTmFtZSgpLmNvbXBhcmVUbyhiLmdldFRlc3RjYXNlTmFtZSgpKTsJCQkKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L1ZhbGlkYXRpb25UeXBlRW51bS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvVmFsaWRhdGlvblR5cGVFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZTEwYzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvVmFsaWRhdGlvblR5cGVFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotCi0vKioKLSAqIEVudW1lcmF0aW9uIG9mIHRoZSB0eXBlcyBvZiB2YWxpZGF0aW9ucyB0aGF0IGNhbiBiZSBydW4uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0aW9uVHlwZUVudW0gewotCXByaXZhdGUgVmFsaWRhdGlvblR5cGVFbnVtKCkgewotCQkvLyBEbyBub3QgcGVybWl0IGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHRvIGJlIGNyZWF0ZWQuCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTl9WQUxJREFUSU9OID0gMDsgLy8gTWFudWFsIGZ1bGwgaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRpb24gYnkgYSB1c2VyLiBBbGwgdmFsaWRhdG9ycyBtdXN0IHN1cHBvcnQgdGhpcyB0eXBlIG9mIHZhbGlkYXRpb24uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlVMTF9WQUxJREFUSU9OID0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxEOyAvLyBNYW51YWwgaW52b2NhdGlvbiBvZiBhIGZ1bGwgYnVpbGQgYnkgYSB1c2VyIHRoYXQgdHJpZ2dlcnMgYSBmdWxsIHZhbGlkYXRpb24uIFZhbGlkYXRvcnMgY2FuLCBidXQgYXJlIG5vdCByZXF1aXJlZCB0bywgc3VwcG9ydCB0aGlzIHR5cGUgb2YgdmFsaWRhdGlvbi4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNSRU1FTlRBTF9WQUxJREFUSU9OID0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRDsgLy8gTWFudWFsIGludm9jYXRpb24gb2YgYW4gaW5jcmVtZW50YWwgYnVpbGQgYnkgYSB1c2VyIHRoYXQgdHJpZ2dlcnMgYW4gaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gVmFsaWRhdG9ycyBjYW4sIGJ1dCBhcmUgbm90IHJlcXVpcmVkIHRvLCBzdXBwb3J0IHRoaXMgdHlwZSBvZiB2YWxpZGF0aW9uLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fVkFMSURBVElPTiA9IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQVVUT19CVUlMRDsgLy8gQXV0b21hdGljIGludm9jYXRpb24gb2YgYW4gaW5jcmVtZW50YWwgYnVpbGQgdGhhdCB0cmlnZ2VycyBhbiBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLiBWYWxpZGF0b3JzIGNhbiwgYnV0IGFyZSBub3QgcmVxdWlyZWQgdG8sIHN1cHBvcnQgdGhpcyB0eXBlIG9mIHZhbGlkYXRpb24uCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOX1ZBTElEQVRJT05fTkFNRSA9ICJSVU5fVkFMSURBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1lOQ19OQU1FID0gIkFTWU5DIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ1JFTUVOVEFMX1ZBTElEQVRJT05fTkFNRSA9ICJJTkNSRU1FTlRBTF9CVUlMRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMX1ZBTElEQVRJT05fTkFNRSA9ICJGVUxMX0JVSUxEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fVkFMSURBVElPTl9OQU1FID0gIkFVVE9fQlVJTEQiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9CVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlNGRlOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9CVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5JT3BlcmF0aW9uUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUltcG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLS8qKgotICogQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIGlzIGEgc2luZ2xldG9uIHdobyByZWFkcyB0aGUgcGx1Z2luIHJlZ2lzdHJ5Ci0gKiBmb3IgVmFsaWRhdG9yIGV4dGVuc2lvbnMuIFRoZSByZWFkIGlzIGRvbmUgb25jZSAoaW4gdGhlIGNvbnN0cnVjdG9yKS4gCi0gKiAKLSAqIAotICogPGV4dGVuc2lvbgotICoJCXBvaW50ID0gImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uZnZ0LnRlc3QiCi0gKgkJaWQgPSAiVmFsaWRhdG9yRlZUIgotICoJCW5hbWUgPSAiVmFsaWRhdG9yIEZWVCBUZXN0Ij4KLSAqCQkJPHRlc3QgcHJvamVjdD0icHJvamVjdE5hbWUiIAotICogCQkJCSAgdmFsaWRhdG9yPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmVqYi5FSkJWYWxpZGF0b3IiCi0gKiAJCQkJICB2ZXJzaW9uPSIxLjEiPgotICoJCQkJPG1lc3NhZ2UgaWQ9IkNIS0oyODE2IiByZXNvdXJjZT0iZWpiLWphci54bWwiIGxvY2F0aW9uPSIyMTYiLz4KLSAqCQkJCTxtZXNzYWdlIGlkPSJDSEtKMjgxNiIgcmVzb3VyY2U9ImVqYi1qYXIueG1sIiBsb2NhdGlvbj0iMjM3Ii8+Ci0gKgkJCQk8bWVzc2FnZSBpZD0iQ0hLSjI4MTYiIHJlc291cmNlPSJlamItamFyLnhtbCIgbG9jYXRpb249IjI1OCIvPgotICoJCQkJPG1lc3NhZ2UgaWQ9IkNIS0oyODE2IiByZXNvdXJjZT0iZWpiLWphci54bWwiIGxvY2F0aW9uPSIyNzkiLz4KLSAqCQkJCTxtZXNzYWdlIGlkPSJDSEtKMjgxNiIgcmVzb3VyY2U9ImVqYi1qYXIueG1sIiBsb2NhdGlvbj0iMzAwIi8+Ci0gKgkJCTwvdGVzdD4KLSAqIAkJCS4uLiBhcyBtYW55IDx0ZXN0PiBhcyBuZWVkZWQKLSAqIDwvZXh0ZW5zaW9uPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIGltcGxlbWVudHMgUmVnaXN0cnlDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciBpbnN0ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBPcGVyYXRpb25UZXN0UmVhZGVyIF9vcFJlYWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgVGVzdFNldHVwUmVhZGVyIF9zZXR1cFJlYWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdGlvblRlc3RSZWFkZXIgX3ZhbFJlYWRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgcmVnaXN0cnkgaXMgcmVhZCBvbmNlIC0gd2hlbiB0aGlzIGNsYXNzIGlzIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHZpc2libGUgdGVzdCBjYXNlcyBmb3IgYWxsIHByb2plY3RzLgotCSAqLwotCXB1YmxpYyBJVGVzdGNhc2VNZXRhRGF0YVtdIGdldFRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTZXQgdGVzdHMgPSBuZXcgSGFzaFNldCgpOwotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHZ0cyA9IGdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIChTdHJpbmcpbnVsbCk7Ci0JCWZvcihpbnQgaj0wOyBqPHZ0cy5sZW5ndGg7IGorKykgewotCQkJdGVzdHMuYWRkKHZ0c1tqXSk7Ci0JCX0KLQkJCi0JCU9wZXJhdGlvblRlc3RjYXNlW10gb3RzID0gZ2V0T3BlcmF0aW9uVGVzdHMobW9uaXRvciwgKFN0cmluZyludWxsKTsKLQkJZm9yKGludCBrPTA7IGs8b3RzLmxlbmd0aDsgaysrKSB7Ci0JCQl0ZXN0cy5hZGQob3RzW2tdKTsKLQkJfQotCi0JCUlUZXN0Y2FzZU1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IElUZXN0Y2FzZU1ldGFEYXRhW3Rlc3RzLnNpemUoKV07Ci0JCXRlc3RzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCB2aXNpYmxlIHRlc3QgY2FzZXMgZm9yIGEgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgSVRlc3RjYXNlTWV0YURhdGFbXSBnZXRUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0W10gcHJvamVjdHMpIHsKLQkJU2V0IHRlc3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yKGludCBpPTA7IGk8cHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gdnRzID0gZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgcHJvamVjdCk7Ci0JCQlmb3IoaW50IGo9MDsgajx2dHMubGVuZ3RoOyBqKyspIHsKLQkJCQl0ZXN0cy5hZGQodnRzW2pdKTsKLQkJCX0KLQkJCQotCQkJT3BlcmF0aW9uVGVzdGNhc2VbXSBvdHMgPSBnZXRPcGVyYXRpb25UZXN0cyhtb25pdG9yLCBwcm9qZWN0KTsKLQkJCWZvcihpbnQgaz0wOyBrPG90cy5sZW5ndGg7IGsrKykgewotCQkJCXRlc3RzLmFkZChvdHNba10pOwotCQkJfQotCQl9Ci0JCQotCQlJVGVzdGNhc2VNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBJVGVzdGNhc2VNZXRhRGF0YVt0ZXN0cy5zaXplKCldOwotCQl0ZXN0cy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB2YWxpZGF0b3IgdGVzdHMgZm9yIGEgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRBbGxWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlWYWxpZGF0aW9uVGVzdFJlYWRlciByZWFkZXIgPSBnZXRWYWxpZGF0aW9uVGVzdFJlYWRlcigpOwotCQlyZXR1cm4gcmVhZGVyLmdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRlc3QgY2FzZXMgb2YgdGhlIG5hbWVkIHZhbGlkYXRvcnMgb24gdGhlIGdpdmVuIHByb2plY3QuCi0JICovCQotCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldEFsbFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMpIHsKLQkJU2V0IHRlc3RTZXQgPSBuZXcgSGFzaFNldCgpOwkJCi0JCVZhbGlkYXRvclRlc3RjYXNlW10gdGVzdHMgPSBnZXRBbGxWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCBwcm9qZWN0KTsKLQkJZm9yKGludCBpPTA7IGk8dmFsaWRhdG9yTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB2YWxpZGF0b3IgPSB2YWxpZGF0b3JOYW1lc1tpXTsKLQkJCWZvcihpbnQgaj0wOyBqPHRlc3RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gdGVzdHNbal07Ci0JCQkJaWYodG1kLmdldFZhbGlkYXRvckNsYXNzKCkuZXF1YWxzKHZhbGlkYXRvcikpIHsKLQkJCQkJdGVzdFNldC5hZGQodG1kKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVt0ZXN0U2V0LnNpemUoKV07Ci0JCXRlc3RTZXQudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIG9mIHRoZSB2aXNpYmxlIHRlc3QgY2FzZXMgdGhhdCByZWdpc3RlciBtZXNzYWdlcyBhZ2FpbnN0IHRoaXMgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgcHJvamVjdC5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgVmFsaWRhdGlvblRlc3RSZWFkZXIgZ2V0VmFsaWRhdGlvblRlc3RSZWFkZXIoKSB7Ci0JCWlmKF92YWxSZWFkZXIgPT0gbnVsbCkgewotCQkJX3ZhbFJlYWRlciA9IG5ldyBWYWxpZGF0aW9uVGVzdFJlYWRlcigpOwotCQl9Ci0JCXJldHVybiBfdmFsUmVhZGVyOwotCX0KLQkKLQlwcml2YXRlIE9wZXJhdGlvblRlc3RSZWFkZXIgZ2V0T3BlcmF0aW9uVGVzdFJlYWRlcigpIHsKLQkJaWYoX29wUmVhZGVyID09IG51bGwpIHsKLQkJCV9vcFJlYWRlciA9IG5ldyBPcGVyYXRpb25UZXN0UmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9vcFJlYWRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBUZXN0U2V0dXBSZWFkZXIgZ2V0VGVzdFNldHVwUmVhZGVyKCkgewotCQlpZiAoX3NldHVwUmVhZGVyID09IG51bGwpIHsKLQkJCV9zZXR1cFJlYWRlciA9IG5ldyBUZXN0U2V0dXBSZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gX3NldHVwUmVhZGVyOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlc3QgY2FzZXMgbmFtZWQgdGVzdE5hbWUsIG9yIGlmIHRlc3ROYW1lIGlzIG51bGwsIHJldHVybiBhbGwgdGVzdCBjYXNlcy4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRWYWxpZGF0aW9uVGVzdFJlYWRlcigpLmdldFZpc2libGVWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCB0ZXN0TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGVzdCBjYXNlcyB0aGF0IHJlZ2lzdGVyIG1lc3NhZ2VzIGFnYWluc3QgdGhpcyBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBPcGVyYXRpb25UZXN0Y2FzZVtdIGdldE9wZXJhdGlvblRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRPcGVyYXRpb25UZXN0cyhtb25pdG9yLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXN0IGNhc2VzIG5hbWVkIHRlc3ROYW1lLCBvciBpZiB0ZXN0TmFtZSBpcyBudWxsLCByZXR1cm4gYWxsIHRlc3QgY2FzZXMuCi0JICovCi0JcHVibGljIE9wZXJhdGlvblRlc3RjYXNlW10gZ2V0T3BlcmF0aW9uVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0T3BlcmF0aW9uVGVzdFJlYWRlcigpLmdldE9wZXJhdGlvblRlc3RzKG1vbml0b3IsIHRlc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBmaWxlcyBuZWVkIHRvIGJlIGltcG9ydGVkLCBpbXBvcnQgdGhlbSBub3cgKGludG8gcHJvamVjdHMgdGhhdCBhcmUgbmFtZWQKLQkgKiB0aGUgc2FtZSBhcyB0aGUgZmlsZXMuKQotCSAqIAotCSAqIElmIElUZXN0Y2FzZU1ldGFEYXRhIGlzIG5vdCBudWxsLCByZXR1cm4gdGhlIFRlc3RTZXR1cEltcG9ydCBmb3IgdGhhdCBwYXJ0aWN1bGFyIHRlc3QuCi0JICogSWYgSVRlc3RjYXNlTWV0YURhdGEgaXMgbnVsbCwgcmV0dXJuIGFsbCBUZXN0U2V0dXBJbXBvcnQuCi0JICovCi0JcHVibGljIFRlc3RTZXR1cEltcG9ydFtdIGdldFRlc3RTZXR1cChJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGRpciwgSVRlc3RjYXNlTWV0YURhdGEgdG1kLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJcmV0dXJuIGdldFRlc3RTZXR1cFJlYWRlcigpLmdldFRlc3RTZXR1cChidWZmZXIsIGRpciwgdG1kLCB2ZXJib3NlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gVmFsaWRhdGlvblRWVFJlZ2lzdHJ5UmVhZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIGdldFJlYWRlcigpIHsKLQkJaWYgKGluc3QgPT0gbnVsbCkgewotCQkJaW5zdCA9IG5ldyBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRpb25UZXN0UmVhZGVyIHsKLQkJcHJpdmF0ZSBNYXAgX3ZhbGlkYXRvclRlc3RzID0gbnVsbDsKLQkJCi0JCVZhbGlkYXRpb25UZXN0UmVhZGVyKCkgewotCQl9Ci0JCQotCQlwdWJsaWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWaXNpYmxlVmFsaWRhdG9yVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB2dHMgPSBnZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCB0ZXN0TmFtZSk7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRlbXAgPSBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbdnRzLmxlbmd0aF07Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yKGludCBpPTA7IGk8dnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yVGVzdGNhc2UgdnQgPSB2dHNbaV07Ci0JCQkJaWYodnQuaXNWaXNpYmxlKCkpIHsKLQkJCQkJdGVtcFtjb3VudCsrXSA9IHZ0OwotCQkJCX0KLQkJCX0KLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlW2NvdW50XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlwdWJsaWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCQlpZiAoX3ZhbGlkYXRvclRlc3RzID09IG51bGwpIHsKLQkJCQlfdmFsaWRhdG9yVGVzdHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCXJlYWRUZXN0Y2FzZVJlZ2lzdHJ5KG1vbml0b3IpOwotCQkJfQotCQotCQkJQ29sbGVjdGlvbiB0bWRzID0gbnVsbDsKLQkJCWlmICh0ZXN0TmFtZSA9PSBudWxsKSB7Ci0JCQkJdG1kcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdmFsaWRhdG9yVGVzdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCXRtZHMuYWRkQWxsKChDb2xsZWN0aW9uKSBpdGVyYXRvci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXRtZHMgPSAoQ29sbGVjdGlvbikgX3ZhbGlkYXRvclRlc3RzLmdldCh0ZXN0TmFtZSk7Ci0JCQl9Ci0JCQlpZiAoKHRtZHMgPT0gbnVsbCkgfHwgKHRtZHMuc2l6ZSgpID09IDApKSB7Ci0JCQkJcmV0dXJuIG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVswXTsKLQkJCX0KLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlW3RtZHMuc2l6ZSgpXTsKLQkJCXRtZHMudG9BcnJheShyZXN1bHQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSBpZiBpdCBleGlzdHMuIE90aGVyd2lzZSwgcmV0dXJuIG51bGwuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRQcm9qZWN0KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJPSkVDVCk7Ci0JCX0KLQotCQlwcml2YXRlIE1lc3NhZ2VNZXRhRGF0YVtdIGdldE1lc3NhZ2VzKFZhbGlkYXRvclRlc3RjYXNlIHRtZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHRlc3RFbGVtZW50KSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBtZXNzYWdlcyA9IHRlc3RFbGVtZW50LmdldENoaWxkcmVuKFRBR19NRVNTQUdFKTsKLQkJCWlmICgobWVzc2FnZXMgPT0gbnVsbCkgfHwgKG1lc3NhZ2VzLmxlbmd0aCA9PSAwKSkgewotCQkJCS8vIE5vIG1lc3NhZ2VzIGFyZSBleHBlY3RlZC4KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJTWVzc2FnZU1ldGFEYXRhW10gbW1kTGlzdCA9IG5ldyBNZXNzYWdlTWV0YURhdGFbbWVzc2FnZXMubGVuZ3RoXTsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTsKLQkJCQlTdHJpbmcgcHJlZml4ID0gbWVzc2FnZS5nZXRBdHRyaWJ1dGUoQVRUX1BSRUZJWCk7Ci0JCQkJaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJFdmVyeSA8bWVzc2FnZT4gbXVzdCBoYXZlIGEgcHJlZml4LiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLy8gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBvcHRpb25hbC4JCQkKLQkJCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gbWVzc2FnZS5nZXRBdHRyaWJ1dGUoQVRUX1JFU09VUkNFKTsKLQkJCQlTdHJpbmcgbG9jYXRpb24gPSBtZXNzYWdlLmdldEF0dHJpYnV0ZShBVFRfTE9DQVRJT04pOwotCQkJCVN0cmluZyB0ZXh0ID0gbWVzc2FnZS5nZXRBdHRyaWJ1dGUoQVRUX1RFWFQpOwotCQkJCWludCBsaW5lTnVtYmVyID0gLTE7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG51bGw7Ci0JCQkJaWYgKChsb2NhdGlvbiAhPSBudWxsKSkgewotCQkJCQl0cnkgewotCQkJCQkJbGluZU51bWJlciA9IEludGVnZXIucGFyc2VJbnQobG9jYXRpb24pOwotCQkJCQkJbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YSh0bWQsIHByZWZpeCwgcmVzb3VyY2VOYW1lLCBsaW5lTnVtYmVyLCB0ZXh0KTsKLQkJCQkJfQotCQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4YykgewotCQkJCQkJLy8gRG9uJ3QgbmVlZCB0byBsb2cgLSB0aGUgbG9jYXRpb24ganVzdCBpc24ndCBhIG51bWJlci4KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChtbWQgPT0gbnVsbCkgewotCQkJCQltbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKHRtZCwgcHJlZml4LCByZXNvdXJjZU5hbWUsIGxvY2F0aW9uLCB0ZXh0KTsKLQkJCQl9Ci0KLQkJCQltbWRMaXN0W2NvdW50KytdID0gbW1kOwotCQkJfQotCi0JCQlpZiAoY291bnQgPT0gbW1kTGlzdC5sZW5ndGgpIHsKLQkJCQlyZXR1cm4gbW1kTGlzdDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCU1lc3NhZ2VNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBNZXNzYWdlTWV0YURhdGFbY291bnRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobW1kTGlzdCwgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRUZXN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUV4dGVuc2lvbiBleHRlbnNpb24sIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHRlc3RFbGVtZW50cykgewotCQkJbW9uaXRvci5zdWJUYXNrKCJSZWFkaW5nIHRlc3QgY2FzZXM7IHBsZWFzZSB3YWl0Li4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCJSZWFkaW5nIHRlc3QgY2FzZSAiICsgKGkgKyAxKSArICIgb2YgIiArIHRlc3RFbGVtZW50cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgdGVzdCA9IHRlc3RFbGVtZW50c1tpXTsKLQotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFByb2plY3QodGVzdCk7Ci0JCQkJaWYgKHByb2plY3ROYW1lID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkV2ZXJ5IHRlc3QgbXVzdCBuYW1lIHRoZSBwcm9qZWN0IHRoYXQgaXQgdmVyaWZpZXMuICIgKyB0ZXN0LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZ2V0VmFsaWRhdG9yTWV0YURhdGEodGVzdCk7Ci0JCQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQkJCS8vIGFscmVhZHkgbG9nZ2VkLCBzbyBqdXN0IHJlYWQgdGhlIG5leHQgdGVzdCBjYXNlLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdldElucHV0RmlsZU5hbWUodGVzdCk7Ci0JCQkJaWYgKGlucHV0RmlsZU5hbWUgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiRXZlcnkgdGVzdCBtdXN0IG5hbWUgdGhlIGZpbGUgdG8gYmUgaW1wb3J0ZWQgYW5kIHRoZW4gdGVzdGVkLiIgKyB0ZXN0LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJYm9vbGVhbiB2aXNpYmxlID0gZ2V0VmlzaWJsZSh0ZXN0KTsKLQotCQkJCVZhbGlkYXRvclRlc3RjYXNlIHRtZCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZShwbHVnaW5JZCwgcHJvamVjdE5hbWUsIHZtZCwgaW5wdXRGaWxlTmFtZSwgdmlzaWJsZSk7Ci0JCQkJdG1kLnNldE1lc3NhZ2VzKGdldE1lc3NhZ2VzKHRtZCwgdGVzdCkpOwotCi0JCQkJLy8gTm93IGFkZCB0aGUgdGVzdCBjYXNlIHRvIHRoZSBNYXAsIHdpdGggdGhlIHByb2plY3QgbmFtZSBhcyB0aGUga2V5IGludG8gCi0JCQkJLy8gdGhlIG1hcC4KLQkJCQlTZXQgcHJqVG1kID0gKFNldCkgX3ZhbGlkYXRvclRlc3RzLmdldChwcm9qZWN0TmFtZSk7Ci0JCQkJaWYgKHByalRtZCA9PSBudWxsKSB7Ci0JCQkJCXByalRtZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJfQotCQkJCXByalRtZC5hZGQodG1kKTsKLQkJCQlfdmFsaWRhdG9yVGVzdHMucHV0KHByb2plY3ROYW1lLCBwcmpUbWQpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB3aXRoIHRoZSBnaXZlbiBmdWxseS1xdWFsaWZpZWQgbmFtZS4KLQkJICogSWYgbm8gc3VjaCBjbGFzcyBjYW4gYmUgZm91bmQsIHJldHVybiBudWxsLgotCQkgKi8KLQkJcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YSBnZXRWYWxpZGF0b3JNZXRhRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiSUNvbmZpZ3VyYXRpb25FbGVtZW50IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJU3RyaW5nIHZhbGlkYXRvckNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1ZBTElEQVRPUik7Ci0JCQl0cnkgewotCQkJCWlmICh2YWxpZGF0b3JDbGFzcyA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJDYW5ub3QgbG9jYXRlIHZhbGlkYXRvciBhdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JDbGFzcyk7Ci0JCQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJDb3VsZCBub3QgZmluZCB2YWxpZGF0b3IgIiArIHZhbGlkYXRvckNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB2bWQ7Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiVGhyb3dhYmxlIGNhdWdodCB3aGlsZSByZXRyaWV2aW5nIElWYWxpZGF0b3IgIiArIHZhbGlkYXRvckNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZWFkcyB0aGUgcmVnaXN0cnkgdG8gZmluZCB0aGUgdGVzdCBjYXNlcyB0aGF0IGhhdmUgYmVlbiBpbXBsZW1lbnRlZC4KLQkJICovCi0JCXByaXZhdGUgdm9pZCByZWFkVGVzdGNhc2VSZWdpc3RyeShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vIEdldCB0aGUgZXh0ZW5zaW9ucyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkLgotCQkJSUV4dGVuc2lvblBvaW50IHZhbGlkYXRvckVQID0gZ2V0VGVzdGNhc2VFeHRlbnNpb25Qb2ludCgpOwotCQkJaWYgKHZhbGlkYXRvckVQID09IG51bGwpIHsKLQkJCQkvLyBlcnJvciBsb2dnZWQgaW4gZ2V0VmFsaWRhdG9yVFZURXh0ZW5zaW9uUG9pbnQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHZhbGlkYXRvckVQLmdldEV4dGVuc2lvbnMoKTsKLQotCQkJLy8gZmluZCBhbGwgcnVudGltZSBpbXBsZW1lbnRhdGlvbnMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCXJlYWRUZXN0Y2FzZUV4dGVuc2lvbihtb25pdG9yLCBleHRlbnNpb25zW2ldKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZWFkcyBvbmUgZXh0ZW5zaW9uIGJ5IGxvb3BpbmcgdGhyb3VnaCBpdHMgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkJICovCi0JCXByaXZhdGUgdm9pZCByZWFkVGVzdGNhc2VFeHRlbnNpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlpZiAoKGVsZW1lbnRzID09IG51bGwpIHx8IChlbGVtZW50cy5sZW5ndGggPT0gMCkpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIk5vIHRlc3RzIGZvdW5kIGZvciAiICsgZXh0ZW5zaW9uLmdldExhYmVsKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWFkZFRlc3QobW9uaXRvciwgZXh0ZW5zaW9uLCBlbGVtZW50cyk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgb3BlcmF0aW9uIGV4dGVuc2lvbiBwb2ludAotCQkgKi8KLQkJcHJpdmF0ZSBJRXh0ZW5zaW9uUG9pbnQgZ2V0VGVzdGNhc2VFeHRlbnNpb25Qb2ludCgpIHsKLQkJCUlQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIFZBTElEQVRPUl9URVNUQ0FTRV9FWFRfUFRfSUQpOwotCQkJaWYgKGV4dGVuc2lvblBvaW50ID09IG51bGwpIHsKLQkJCQkvLyBJZiB0aGlzIGhhcHBlbnMgaXQgbWVhbnMgdGhhdCBzb21lb25lIHJlbW92ZWQgdGhlICJ2YWxpZGF0b3IiIGV4dGVuc2lvbiBwb2ludCBkZWNsYXJhdGlvbiAKLQkJCQkvLyBmcm9tIG91ciBwbHVnaW4ueG1sIGZpbGUuCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIFBMVUdJTl9JRCArICIuIiArIFZBTElEQVRPUl9URVNUQ0FTRV9FWFRfUFRfSUQgKyAiIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgdmFsaWRhdGlvbiBUVlQgcGx1Z2luLnhtbCBmaWxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBleHRlbnNpb25Qb2ludDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgd2hpY2ggbXVzdCBiZSBpbXBvcnRlZCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBjYW4gYmUgcnVuLgotCQkgKiBSZXR1cm4gbnVsbCBpZiBubyBpbnB1dCBuYW1lIGlzIHNldC4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBnZXRWaXNpYmxlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJnZXRWaXNpYmxlOjpJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJU3RyaW5nIGF0dHJpYiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9WSVNJQkxFKTsKLQkJCWlmIChhdHRyaWIgPT0gbnVsbCkgewotCQkJCS8vIGRlZmF1bHQgaXMgdmlzaWJsZQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGF0dHJpYikuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIGlucHV0IHdoaWNoIG11c3QgYmUgaW1wb3J0ZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2UgY2FuIGJlIHJ1bi4KLQkJICogUmV0dXJuIG51bGwgaWYgbm8gaW5wdXQgbmFtZSBpcyBzZXQuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJnZXRJbnB1dEZpbGVOYW1lOjpJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lOUFVUKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBPcGVyYXRpb25UZXN0UmVhZGVyIHsKLQkJcHJpdmF0ZSBNYXAgX29wZXJhdGlvblRlc3RzID0gbnVsbDsKLQotCQlPcGVyYXRpb25UZXN0UmVhZGVyKCkgewotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSB0ZXN0IGNhc2VzIG5hbWVkIHRlc3ROYW1lLCBvciBpZiB0ZXN0TmFtZSBpcyBudWxsLCByZXR1cm4gYWxsIHRlc3QgY2FzZXMuCi0JCSAqLwotCQlwdWJsaWMgT3BlcmF0aW9uVGVzdGNhc2VbXSBnZXRPcGVyYXRpb25UZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCQlpZiAoX29wZXJhdGlvblRlc3RzID09IG51bGwpIHsKLQkJCQlfb3BlcmF0aW9uVGVzdHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCXJlYWRPcGVyYXRpb25UZXN0Y2FzZVJlZ2lzdHJ5KG1vbml0b3IpOwotCQkJfQotCi0JCQlDb2xsZWN0aW9uIHRtZHMgPSBudWxsOwotCQkJaWYgKHRlc3ROYW1lID09IG51bGwpIHsKLQkJCQl0bWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IF9vcGVyYXRpb25UZXN0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJdG1kcy5hZGRBbGwoKENvbGxlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdG1kcyA9IChDb2xsZWN0aW9uKSBfb3BlcmF0aW9uVGVzdHMuZ2V0KHRlc3ROYW1lKTsKLQkJCX0KLQkJCWlmICgodG1kcyA9PSBudWxsKSB8fCAodG1kcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlyZXR1cm4gbmV3IE9wZXJhdGlvblRlc3RjYXNlWzBdOwotCQkJfQotCQkJT3BlcmF0aW9uVGVzdGNhc2VbXSByZXN1bHQgPSBuZXcgT3BlcmF0aW9uVGVzdGNhc2VbdG1kcy5zaXplKCldOwotCQkJdG1kcy50b0FycmF5KHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCB3aGljaCBtdXN0IGJlIGltcG9ydGVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIGNhbiBiZSBydW4uCi0JCSAqIFJldHVybiBudWxsIGlmIG5vIGlucHV0IG5hbWUgaXMgc2V0LgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0SW5wdXRGaWxlTmFtZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiZ2V0SW5wdXRGaWxlTmFtZTo6SUNvbmZpZ3VyYXRpb25FbGVtZW50IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JTlBVVCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkT3BlcmF0aW9uVGVzdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElFeHRlbnNpb24gZXh0ZW5zaW9uLCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0ZXN0RWxlbWVudHMpIHsKLQkJCW1vbml0b3Iuc3ViVGFzaygiUmVhZGluZyB0ZXN0IGNhc2VzOyBwbGVhc2Ugd2FpdC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCW1vbml0b3Iuc3ViVGFzaygiUmVhZGluZyB0ZXN0IGNhc2UgIiArIChpICsgMSkgKyAiIG9mICIgKyB0ZXN0RWxlbWVudHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHRlc3QgPSB0ZXN0RWxlbWVudHNbaV07Ci0KLQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBnZXRQcm9qZWN0KHRlc3QpOwotCQkJCWlmIChwcm9qZWN0TmFtZSA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJFdmVyeSB0ZXN0IG11c3QgbmFtZSB0aGUgcHJvamVjdCB0aGF0IGl0IHZlcmlmaWVzLiAiICsgdGVzdC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCUlPcGVyYXRpb25SdW5uYWJsZSBvcCA9IGdldE9wZXJhdGlvbih0ZXN0KTsKLQkJCQlpZiAob3AgPT0gbnVsbCkgewotCQkJCQkvLyBhbHJlYWR5IGxvZ2dlZCwgc28ganVzdCByZWFkIHRoZSBuZXh0IHRlc3QgY2FzZS4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnZXRJbnB1dEZpbGVOYW1lKHRlc3QpOwotCQkJCWlmIChpbnB1dEZpbGVOYW1lID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkV2ZXJ5IHRlc3QgbXVzdCBuYW1lIHRoZSBmaWxlIHRvIGJlIGltcG9ydGVkIGFuZCB0aGVuIHRlc3RlZC4iICsgdGVzdC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCVN0cmluZyBpZCA9IGV4dGVuc2lvbi5nZXRMYWJlbCgpOwotCi0JCQkJT3BlcmF0aW9uVGVzdGNhc2UgdG1kID0gbmV3IE9wZXJhdGlvblRlc3RjYXNlKHBsdWdpbklkLCBwcm9qZWN0TmFtZSwgaWQsIGlucHV0RmlsZU5hbWUsIG9wKTsKLQotCQkJCS8vIE5vdyBhZGQgdGhlIHRlc3QgY2FzZSB0byB0aGUgTWFwLCB3aXRoIHRoZSBwcm9qZWN0IG5hbWUgYXMgdGhlIGtleSBpbnRvIAotCQkJCS8vIHRoZSBtYXAuCi0JCQkJU2V0IHByalRtZCA9IChTZXQpIF9vcGVyYXRpb25UZXN0cy5nZXQocHJvamVjdE5hbWUpOwotCQkJCWlmIChwcmpUbWQgPT0gbnVsbCkgewotCQkJCQlwcmpUbWQgPSBuZXcgSGFzaFNldCgpOwotCQkJCX0KLQkJCQlwcmpUbWQuYWRkKHRtZCk7Ci0JCQkJX29wZXJhdGlvblRlc3RzLnB1dChwcm9qZWN0TmFtZSwgcHJqVG1kKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZWFkcyBvbmUgZXh0ZW5zaW9uIGJ5IGxvb3BpbmcgdGhyb3VnaCBpdHMgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkJICovCi0JCXByaXZhdGUgdm9pZCByZWFkT3BlcmF0aW9uVGVzdGNhc2VFeHRlbnNpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlpZiAoKGVsZW1lbnRzID09IG51bGwpIHx8IChlbGVtZW50cy5sZW5ndGggPT0gMCkpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIk5vIHRlc3RzIGZvdW5kIGZvciAiICsgZXh0ZW5zaW9uLmdldExhYmVsKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWFkZE9wZXJhdGlvblRlc3QobW9uaXRvciwgZXh0ZW5zaW9uLCBlbGVtZW50cyk7Ci0JCX0KLQotCQkvKioKLQkJICogUmVhZHMgdGhlIHJlZ2lzdHJ5IHRvIGZpbmQgdGhlIHRlc3QgY2FzZXMgdGhhdCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgcmVhZE9wZXJhdGlvblRlc3RjYXNlUmVnaXN0cnkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkvLyBHZXQgdGhlIGV4dGVuc2lvbnMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZC4KLQkJCUlFeHRlbnNpb25Qb2ludCBvcEVQID0gZ2V0T3BlcmF0aW9uVGVzdGNhc2VFeHRlbnNpb25Qb2ludCgpOwotCQkJaWYgKG9wRVAgPT0gbnVsbCkgewotCQkJCS8vIGVycm9yIGxvZ2dlZCBpbiBnZXRWYWxpZGF0b3JUVlRFeHRlbnNpb25Qb2ludAotCQkJCXJldHVybjsKLQkJCX0KLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gb3BFUC5nZXRFeHRlbnNpb25zKCk7Ci0KLQkJCS8vIGZpbmQgYWxsIHJ1bnRpbWUgaW1wbGVtZW50YXRpb25zCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZWFkT3BlcmF0aW9uVGVzdGNhc2VFeHRlbnNpb24obW9uaXRvciwgZXh0ZW5zaW9uc1tpXSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UgaWYgaXQgZXhpc3RzLiBPdGhlcndpc2UsIHJldHVybiBudWxsLgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvamVjdChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BST0pFQ1QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIFRlc3RDYXNlIGV4dGVuc2lvbiBwb2ludAotCQkgKi8KLQkJcHJpdmF0ZSBJRXh0ZW5zaW9uUG9pbnQgZ2V0T3BlcmF0aW9uVGVzdGNhc2VFeHRlbnNpb25Qb2ludCgpIHsKLQkJCUlQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIFZBTElEQVRPUl9PUEVSQVRJT05fVEVTVENBU0VfRVhUX1BUX0lEKTsKLQkJCWlmIChleHRlbnNpb25Qb2ludCA9PSBudWxsKSB7Ci0JCQkJLy8gSWYgdGhpcyBoYXBwZW5zIGl0IG1lYW5zIHRoYXQgc29tZW9uZSByZW1vdmVkIHRoZSAib3B0ZXN0IiBleHRlbnNpb24gcG9pbnQgZGVjbGFyYXRpb24gCi0JCQkJLy8gZnJvbSBvdXIgcGx1Z2luLnhtbCBmaWxlLgotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBQTFVHSU5fSUQgKyAiLiIgKyBWQUxJREFUT1JfT1BFUkFUSU9OX1RFU1RDQVNFX0VYVF9QVF9JRCArICIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB2YWxpZGF0aW9uIFRWVCBwbHVnaW4ueG1sIGZpbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGV4dGVuc2lvblBvaW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB3aXRoIHRoZSBnaXZlbiBmdWxseS1xdWFsaWZpZWQgbmFtZS4KLQkJICogSWYgbm8gc3VjaCBjbGFzcyBjYW4gYmUgZm91bmQsIHJldHVybiBudWxsLgotCQkgKi8KLQkJcHJpdmF0ZSBJT3BlcmF0aW9uUnVubmFibGUgZ2V0T3BlcmF0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlTdHJpbmcgb3BDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9PUEVSQVRJT04pOwotCQkJdHJ5IHsKLQkJCQlpZiAob3BDbGFzcyA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJDYW5ub3QgbG9jYXRlIG9wZXJhdGlvbiBhdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJSU9wZXJhdGlvblJ1bm5hYmxlIG9wID0gKElPcGVyYXRpb25SdW5uYWJsZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9PUEVSQVRJT04pOwotCQkJCWlmIChvcCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJDb3VsZCBub3QgZmluZCBvcGVyYXRpb24gIiArIG9wQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG9wOwotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIlRocm93YWJsZSBjYXVnaHQgd2hpbGUgcmV0cmlldmluZyBJVmFsaWRhdG9yICIgKyBvcENsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0U2V0dXBSZWFkZXIgewotCQlwcml2YXRlIFRlc3RTZXR1cEltcG9ydFtdIF90ZXN0U2V0dXAgPSBudWxsOwotCi0JCVRlc3RTZXR1cFJlYWRlcigpIHsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCB3aGljaCBtdXN0IGJlIGltcG9ydGVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIGNhbiBiZSBydW4uCi0JCSAqIFJldHVybiBudWxsIGlmIG5vIGlucHV0IG5hbWUgaXMgc2V0LgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0SW5wdXRGaWxlTmFtZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiZ2V0SW5wdXRGaWxlTmFtZTo6SUNvbmZpZ3VyYXRpb25FbGVtZW50IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JTlBVVCk7Ci0JCX0KLQotCQkvKioKLQkJICogSWYgZmlsZXMgbmVlZCB0byBiZSBpbXBvcnRlZCwgaW1wb3J0IHRoZW0gbm93IChpbnRvIHByb2plY3RzIHRoYXQgYXJlIG5hbWVkCi0JCSAqIHRoZSBzYW1lIGFzIHRoZSBmaWxlcy4pCi0JCSAqIAotCQkgKiBJZiBJVGVzdGNhc2VNZXRhRGF0YSBpcyBub3QgbnVsbCwgcmV0dXJuIHRoZSBUZXN0U2V0dXBJbXBvcnQgZm9yIHRoYXQgcGFydGljdWxhciB0ZXN0LgotCQkgKiBJZiBJVGVzdGNhc2VNZXRhRGF0YSBpcyBudWxsLCByZXR1cm4gYWxsIFRlc3RTZXR1cEltcG9ydC4KLQkJICovCi0JCXB1YmxpYyBUZXN0U2V0dXBJbXBvcnRbXSBnZXRUZXN0U2V0dXAoSUJ1ZmZlciBidWZmZXIsIFN0cmluZyBkaXIsIElUZXN0Y2FzZU1ldGFEYXRhIHRtZCwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCQlpZiAoX3Rlc3RTZXR1cCA9PSBudWxsKSB7Ci0JCQkJcmVhZFNldHVwUmVnaXN0cnkoYnVmZmVyLCB2ZXJib3NlKTsKLQkJCX0KLQkJCWlmICh0bWQgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgX3Rlc3RTZXR1cC5sZW5ndGg7IGorKykgewotCQkJCQlUZXN0U2V0dXBJbXBvcnQgdHNpID0gX3Rlc3RTZXR1cFtqXTsKLQkJCQkJaWYgKHRzaS5nZXRGaWxlTmFtZSgpLmVuZHNXaXRoKHRtZC5nZXRJbnB1dEZpbGVOYW1lKCkpKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFRlc3RTZXR1cEltcG9ydFtdIHsgdHNpIH07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBUZXN0U2V0dXBJbXBvcnRbMF07Ci0JCQl9Ci0JCQlyZXR1cm4gX3Rlc3RTZXR1cDsKLQkJfQotCQotCQlwcml2YXRlIHZvaWQgYWRkU2V0dXAoSUJ1ZmZlciBidWZmZXIsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGltcG9ydEVsZW1lbnRzLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJCWlmICgoaW1wb3J0RWxlbWVudHMgPT0gbnVsbCkgfHwgKGltcG9ydEVsZW1lbnRzLmxlbmd0aCA9PSAwKSkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJObyB0ZXN0IHNldHVwIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBtZXNzYWdlKTsKLQkJCQkJYnVmZmVyLndyaXRlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVRlc3RTZXR1cEltcG9ydFtdIHRlbXAgPSBuZXcgVGVzdFNldHVwSW1wb3J0W2ltcG9ydEVsZW1lbnRzLmxlbmd0aF07Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBpbXBvcnRFbGVtZW50ID0gaW1wb3J0RWxlbWVudHNbaV07Ci0JCQkJU3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnZXRJbnB1dEZpbGVOYW1lKGltcG9ydEVsZW1lbnQpOwotCQkJCWlmIChpbnB1dEZpbGVOYW1lID09IG51bGwpIHsKLQkJCQkJLy8gQWxyZWFkeSBsb2dnZWQgaW4gZ2V0SW5wdXRGaWxlTmFtZQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlJSW1wb3J0T3BlcmF0aW9uIG9wID0gZ2V0SW1wb3J0T3BlcmF0aW9uKGJ1ZmZlciwgaW1wb3J0RWxlbWVudCk7Ci0JCQkJaWYgKG9wID09IG51bGwpIHsKLQkJCQkJYnVmZmVyLndyaXRlKCJJbXBvcnQgb3BlcmF0aW9uIGNhbm5vdCBiZSBmb3VuZC4gSWdub3JpbmcgaW1wb3J0LiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlUZXN0U2V0dXBJbXBvcnQgdHMgPSBuZXcgVGVzdFNldHVwSW1wb3J0KG9wLCBpbnB1dEZpbGVOYW1lKTsKLQkJCQl0ZW1wW2NvdW50KytdID0gdHM7Ci0JCQl9Ci0KLQkJCWlmIChfdGVzdFNldHVwID09IG51bGwpIHsKLQkJCQlpZiAoY291bnQgPT0gdGVtcC5sZW5ndGgpIHsKLQkJCQkJX3Rlc3RTZXR1cCA9IHRlbXA7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlfdGVzdFNldHVwID0gbmV3IFRlc3RTZXR1cEltcG9ydFtjb3VudF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgX3Rlc3RTZXR1cCwgMCwgY291bnQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVRlc3RTZXR1cEltcG9ydFtdIG5ld1Rlc3RTZXR1cCA9IG5ldyBUZXN0U2V0dXBJbXBvcnRbX3Rlc3RTZXR1cC5sZW5ndGggKyBjb3VudF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShfdGVzdFNldHVwLCAwLCBuZXdUZXN0U2V0dXAsIDAsIF90ZXN0U2V0dXAubGVuZ3RoKTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIG5ld1Rlc3RTZXR1cCwgX3Rlc3RTZXR1cC5sZW5ndGgsIGNvdW50KTsKLQkJCQlfdGVzdFNldHVwID0gbmV3VGVzdFNldHVwOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlYWRzIG9uZSBleHRlbnNpb24gYnkgbG9vcGluZyB0aHJvdWdoIGl0cyBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHJlYWRTZXR1cEV4dGVuc2lvbihJQnVmZmVyIGJ1ZmZlciwgSUV4dGVuc2lvbiBleHRlbnNpb24sIGJvb2xlYW4gdmVyYm9zZSkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlhZGRTZXR1cChidWZmZXIsIGVsZW1lbnRzLCB2ZXJib3NlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBUZXN0Q2FzZVNldHVwIGV4dGVuc2lvbiBwb2ludAotCQkgKi8KLQkJcHJpdmF0ZSBJRXh0ZW5zaW9uUG9pbnQgZ2V0U2V0dXBFeHRlbnNpb25Qb2ludCgpIHsKLQkJCUlQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIFZBTElEQVRPUl9TRVRVUF9FWFRfUFRfSUQpOwotCQkJaWYgKGV4dGVuc2lvblBvaW50ID09IG51bGwpIHsKLQkJCQkvLyBJZiB0aGlzIGhhcHBlbnMgaXQgbWVhbnMgdGhhdCBzb21lb25lIHJlbW92ZWQgdGhlICJ2YWxpZGF0b3IiIGV4dGVuc2lvbiBwb2ludCBkZWNsYXJhdGlvbiAKLQkJCQkvLyBmcm9tIG91ciBwbHVnaW4ueG1sIGZpbGUuCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIFBMVUdJTl9JRCArICIuIiArIFZBTElEQVRPUl9TRVRVUF9FWFRfUFRfSUQgKyAiIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgdmFsaWRhdGlvbiBUVlQgcGx1Z2luLnhtbCBmaWxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBleHRlbnNpb25Qb2ludDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZWFkcyB0aGUgcmVnaXN0cnkgdG8gZmluZCB0aGUgdGVzdCBzZXR1cCB0aGF0IG11c3QgYmUgcGVyZm9ybWVkLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHJlYWRTZXR1cFJlZ2lzdHJ5KElCdWZmZXIgYnVmZmVyLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJCS8vIEdldCB0aGUgZXh0ZW5zaW9ucyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkLgotCQkJSUV4dGVuc2lvblBvaW50IHZhbGlkYXRvckVQID0gZ2V0U2V0dXBFeHRlbnNpb25Qb2ludCgpOwotCQkJaWYgKHZhbGlkYXRvckVQID09IG51bGwpIHsKLQkJCQkvLyBlcnJvciBsb2dnZWQgaW4gZ2V0VmFsaWRhdG9yVFZURXh0ZW5zaW9uUG9pbnQKLQkJCQlidWZmZXIud3JpdGUoIkV4dGVuc2lvbiBwb2ludCBpcyBtaXNzaW5nLiBDYW5ub3QgaW1wb3J0IHRlc3QgY2FzZXMuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHZhbGlkYXRvckVQLmdldEV4dGVuc2lvbnMoKTsKLQkJCWlmIChleHRlbnNpb25zLmxlbmd0aCA9PSAwKSB7Ci0JCQkJYnVmZmVyLndyaXRlKCJObyBleHRlbnNpb25zIGZvdW5kLiBDYW5ub3QgaW1wb3J0IHRlc3QgY2FzZXMuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGZpbmQgYWxsIHJ1bnRpbWUgaW1wbGVtZW50YXRpb25zCi0JCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiUmVhZGluZyBzZXR1cCA8aW1wb3J0PiBleHRlbnNpb25zOyBwbGVhc2Ugd2FpdC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiUmVhZGluZyBzZXR1cCA8aW1wb3J0PiAiICsgKGkgKyAxKSArICIgb2YgIiArIGV4dGVuc2lvbnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmVhZFNldHVwRXh0ZW5zaW9uKGJ1ZmZlciwgZXh0ZW5zaW9uc1tpXSwgdmVyYm9zZSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBvcGVyYXRpb24gd2hpY2ggaXMgdXNlZCB0byBpbXBvcnQgdGhlIGlucHV0LgotCQkgKi8KLQkJcHJpdmF0ZSBJSW1wb3J0T3BlcmF0aW9uIGdldEltcG9ydE9wZXJhdGlvbihJQnVmZmVyIGJ1ZmZlciwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiSUNvbmZpZ3VyYXRpb25FbGVtZW50IGlzIG51bGwiOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIG1lc3NhZ2UpOwotCQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlTdHJpbmcgb3BDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9PUEVSQVRJT04pOwotCQkJdHJ5IHsKLQkJCQlpZiAob3BDbGFzcyA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gIkJlY2F1c2UgdGhlcmUgaXMgbm8gb3BlcmF0aW9uIGF0dHJpYnV0ZSwgYXNzdW1pbmcgdGhhdCB0aGUgaW5wdXQgaXMgYSB3b3Jrc3BhY2UuIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgbWVzc2FnZSk7Ci0JCQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJT2JqZWN0IHRlbXAgPSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX09QRVJBVElPTik7Ci0JCQkJaWYgKHRlbXAgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJvcGVyYXRpb24gIiArIG9wQ2xhc3MgKyAiIGNhbm5vdCBiZSBjcmVhdGVkLiBJZ25vcmluZyB0aGUgdGVzdCBjYXNlLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgbWVzc2FnZSk7Ci0JCQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRlbXAgaW5zdGFuY2VvZiBJSW1wb3J0T3BlcmF0aW9uKSB7Ci0JCQkJCXJldHVybiAoSUltcG9ydE9wZXJhdGlvbikgdGVtcDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gIm9wZXJhdGlvbiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIElJbXBvcnRPcGVyYXRpb24uIElnbm9yaW5nIHRoZSB0ZXN0IGNhc2UuIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgbWVzc2FnZSk7Ci0JCQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiVGhyb3dhYmxlIGNhdWdodCB3aGlsZSByZXRyaWV2aW5nIElJbXBvcnRPcGVyYXRpb24gIiArIG9wQ2xhc3MgKyAiIElnbm9yaW5nIHRoZSB0ZXN0IGNhc2UuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIG1lc3NhZ2UpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvQnVpbGRJbmZvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9CdWlsZEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0YTdhNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9CdWlsZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotcHVibGljIGNsYXNzIEJ1aWxkSW5mbyB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICJMaWNlbnNlZCBNYXRlcmlhbHMgLS0gUHJvcGVydHkgb2YgSUJNXG4oYykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIDIwMDEsMjAwM1xuVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ0J1aWxkTGV2ZWwgPSAiMjAwMzExMTJfMTkxNS1XQjIxMi1BRC1WNTExRC1XNSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTQUJ1aWxkTGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0lUZXN0Y2FzZU1ldGFEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9JVGVzdGNhc2VNZXRhRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDU4NDYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0lUZXN0Y2FzZU1ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgdGVzdCBjYXNlIHRoYXQgZWl0aGVyIHNob3VsZCBiZSBydW4KLSAqIGFzIHBhcnQgb2YgdGhlIFZhbGlkYXRpb24gQlZUIFN1aXRlLCBvciB0aGF0IGlzIHBhcnQgb2YgYSB0ZXN0Ci0gKiBjYXNlIHRoYXQgaXMgcnVuIGJ5IHRoZSBWYWxpZGF0aW9uIEJWVCBTdWl0ZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVGVzdGNhc2VNZXRhRGF0YSB7Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyB0ZXN0IGNhc2Ugc2hvdWxkIGJlIHNob3duIGFzIGEgdGVzdCBvbiAKLQkgKiB0aGUgdGVzdCBjb2xsZWN0b3IgbWVudS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2plY3QgdGhhdCB0aGlzIHRlc3QgY2FzZSBpcyBkZXNpZ25lZCB0byBydW4gb24uCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGlzIHRlc3QgY2FzZSBpcyBkZXNpZ25lZCAKLQkgKiB0byBydW4gb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGRlY2xhcmVkIHRoaXMgdGVzdCBjYXNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyaW5nUGx1Z2luSWQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0ZXN0IGNhc2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgbXVzdCBiZSBpbXBvcnRlZCBmb3IgdGhpcyB0ZXN0IGNhc2UKLQkgKiB0byBydW4gb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKCk7Ci0JCi0JLyoqCi0JICogSW1wb3J0IHRoZSBmaWxlLCBpZiBuZWNlc3NhcnksIGFuZCBydW4gdGhpcyB0ZXN0LiBUaGUgdGVzdCBjYXNlCi0JICogcmVwb3J0cyB3aGV0aGVyIG9yIG5vdCB0aGUgdGVzdCBwYXNzZXMgdG8gdGhlIElUZXN0QnVmZmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9NZXNzYWdlTWV0YURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L01lc3NhZ2VNZXRhRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjNiYmFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L01lc3NhZ2VNZXRhRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZU1ldGFEYXRhIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5FTk9fVU5TRVQgPSAtMTsKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZVByZWZpeCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3Jlc291cmNlID0gbnVsbDsKLQlwcml2YXRlIGludCBfbGluZU51bWJlciA9IExJTkVOT19VTlNFVDsKLQlwcml2YXRlIFN0cmluZyBfbG9jYXRpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF90ZXh0ID0gbnVsbDsgLy8gV2hlbiB0aGlzIHRlc3QgY2FzZSB3YXMgZ2VuZXJhdGVkLCB3aGF0IHdhcyB0aGUgdGV4dCBvZiB0aGUgbWFya2VyPyBUaGlzIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB3aGVuIG1lc3NhZ2UgcHJlZml4ZXMgY2hhbmdlOyB0aGUgdGVzdCBjYXNlIHdpbGwgZmFpbCBiZWNhdXNlIHRoZSBwcmVmaXggZG9lc24ndCBtYXRjaCwgYnV0IGl0J3MgZWFzeSB0byBzZWUgdGhhdCB0aGUgb2xkIHByZWZpeCB0ZXN0ZWQgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIG5ldyBwcmVmaXguCi0JcHJpdmF0ZSBWYWxpZGF0b3JUZXN0Y2FzZSBfdG1kID0gbnVsbDsgLy8gcG9pbnRlciBiYWNrIHRvIHRoZSB0ZXN0Y2FzZSBwYXJlbnQKLQkKLQlwdWJsaWMgTWVzc2FnZU1ldGFEYXRhKFZhbGlkYXRvclRlc3RjYXNlIHRtZCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHJlc291cmNlLCBpbnQgbGluZU51bWJlciwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcyh0bWQsIHByZWZpeCwgcmVzb3VyY2UsIHRleHQpOwotCQlfbGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JfQotCQotCXB1YmxpYyBNZXNzYWdlTWV0YURhdGEoVmFsaWRhdG9yVGVzdGNhc2UgdG1kLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgcmVzb3VyY2UsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcyh0bWQsIHByZWZpeCwgcmVzb3VyY2UsIHRleHQpOwotCQlfbG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0JCi0JcHVibGljIE1lc3NhZ2VNZXRhRGF0YShWYWxpZGF0b3JUZXN0Y2FzZSB0bWQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIHRleHQpIHsKLQkJX3RtZCA9IHRtZDsKLQkJX21lc3NhZ2VQcmVmaXggPSBwcmVmaXg7Ci0JCV9yZXNvdXJjZSA9IHJlc291cmNlOwotCQlfdGV4dCA9ICh0ZXh0ID09IG51bGwpID8gIiIgOiB0ZXh0OyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZSBnZXRWYWxpZGF0b3JUZXN0Y2FzZSgpIHsKLQkJcmV0dXJuIF90bWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVByZWZpeCgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlUHJlZml4OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gX3Jlc291cmNlOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCXJldHVybiBfbGluZU51bWJlcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIF9sb2NhdGlvbjsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRvclRlc3RjYXNlKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gX3RleHQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIChfbGluZU51bWJlciAhPSBMSU5FTk9fVU5TRVQpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NldExvY2F0aW9uKCkgewotCQlyZXR1cm4gaXNTZXQoX2xvY2F0aW9uKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGlzU2V0KF9yZXNvdXJjZSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1NldChTdHJpbmcgdmFsdWUpIHsKLQkJaWYodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZih2YWx1ZS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9NZXNzYWdlVXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvTWVzc2FnZVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlYWVlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9NZXNzYWdlVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5Qcm9wZXJ0eUxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VVdGlsaXR5IHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX1RFU1RDQVNFX01FU1NBR0VfVEVNUExBVEVfID0gIjxtZXNzYWdlIHByZWZpeD1cInswfVwiIHJlc291cmNlPVwiezF9XCIgbG9jYXRpb249XCJ7Mn1cIiB0ZXh0PVwiezN9XCIvPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX1RFU1RDQVNFX01BUktFUl9URU1QTEFURV8gPSAgIjxtYXJrZXIgcHJlZml4PVwiezB9XCIgcmVzb3VyY2U9XCJ7MX1cIiBsb2NhdGlvbj1cInsyfVwiIHRleHQ9XCJ7M31cIi8+IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIE1lc3NhZ2VDb21wYXJhdG9yIF9tZXNzYWdlQ29tcGFyYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZUlkQ29tcGFyYXRvciBfbWVzc2FnZUlkQ29tcGFyYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZVByZWZpeENvbXBhcmF0b3IgX21lc3NhZ2VQcmVmaXhDb21wYXJhdG9yID0gbnVsbDsKLQkKLQlwcml2YXRlIE1lc3NhZ2VVdGlsaXR5KCkgewotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhNZXNzYWdlTWV0YURhdGEgbW1kKSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IChtbWQuaXNTZXRMaW5lTnVtYmVyKCkpID8gU3RyaW5nLnZhbHVlT2YobW1kLmdldExpbmVOdW1iZXIoKSkgOiBtbWQuZ2V0TG9jYXRpb24oKTsKLQkJcmV0dXJuIHRvU3RyaW5nKG1tZC5nZXRNZXNzYWdlUHJlZml4KCksIG1tZC5nZXRSZXNvdXJjZSgpLCBsb2NhdGlvbiwgbW1kLmdldFRleHQoKSwgX1RFU1RDQVNFX01FU1NBR0VfVEVNUExBVEVfKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoSU1hcmtlciBtYXJrZXIpIHsKLQkJSW50ZWdlciBsaW5lTnVtYmVyID0gTWVzc2FnZVV0aWxpdHkuZ2V0TGluZU51bWJlcihtYXJrZXIpOwotCQlTdHJpbmcgbG9jYXRpb24gPSAobGluZU51bWJlciA9PSBudWxsKSA/IChsb2NhdGlvbiA9IE1lc3NhZ2VVdGlsaXR5LmdldExvY2F0aW9uKG1hcmtlcikpIDogKGxvY2F0aW9uID0gbGluZU51bWJlci50b1N0cmluZygpKTsKLQkJcmV0dXJuIHRvU3RyaW5nKGdldE1lc3NhZ2VQcmVmaXgobWFya2VyKSwgZ2V0UmVzb3VyY2UobWFya2VyKSwgbG9jYXRpb24sIGdldE1lc3NhZ2UobWFya2VyKSwgX1RFU1RDQVNFX01BUktFUl9URU1QTEFURV8pOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIGZtc3NnUHJlZml4LCBTdHJpbmcgZnJlc291cmNlLCBTdHJpbmcgZmxvY2F0aW9uLCBTdHJpbmcgZnRleHQsIFN0cmluZyB0ZW1wbGF0ZSkgewotCQlTdHJpbmcgbXNzZ1ByZWZpeCA9IChmbXNzZ1ByZWZpeCA9PSBudWxsKSA/ICIiIDogZm1zc2dQcmVmaXg7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc291cmNlID0gKGZyZXNvdXJjZSA9PSBudWxsKSA/ICIiIDogZnJlc291cmNlOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsb2NhdGlvbiA9IChmbG9jYXRpb24gPT0gbnVsbCkgPyAiIiA6IGZsb2NhdGlvbjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdGV4dCA9IChmdGV4dCA9PSBudWxsKSA/ICIiIDogZnRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRlbXBsYXRlLCBuZXcgU3RyaW5nW117bXNzZ1ByZWZpeCwgcmVzb3VyY2UsIGxvY2F0aW9uLCB0ZXh0fSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2plY3QoSU1hcmtlciBtYXJrZXIpIHsKLQkJcmV0dXJuIG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2UoSU1hcmtlciBtYXJrZXIpIHsKLQkJcmV0dXJuIG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpOwotCX0KLQkKLQotCS8vIEJhc2VkIG9uIHRoZSBsYXN0IGxldHRlciBvZiB0aGUgbWVzc2FnZSBwcmVmaXgsIHdoYXQgc2V2ZXJpdHkKLQkvLyBzaG91bGQgdGhpcyBtYXJrZXIgYmU/Ci0JcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldFNldmVyaXR5KElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBtZXNzYWdlID0gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSk7Ci0JCWlmKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIHRva2VucyA9IHBhcnNlKG1lc3NhZ2UpOwotCQlTdHJpbmcgc2V2ZXJpdHkgPSB0b2tlbnNbMV07Ci0JCUludGVnZXIgcmVzdWx0OwotCQlpZihzZXZlcml0eS5lcXVhbHMoIkUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBuZXcgSW50ZWdlcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJfQotCQllbHNlIGlmKHNldmVyaXR5LmVxdWFscygiVyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IG5ldyBJbnRlZ2VyKElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyk7Ci0JCX0KLQkJZWxzZSBpZihzZXZlcml0eS5lcXVhbHMoIkkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBuZXcgSW50ZWdlcihJTWFya2VyLlNFVkVSSVRZX0lORk8pOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUHJlZml4KElNYXJrZXIgbWFya2VyKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZShtYXJrZXIpOwotCQlpZihtZXNzYWdlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlTdHJpbmdbXSB0b2tlbnMgPSBwYXJzZShtZXNzYWdlKTsKLQkJcmV0dXJuIHRva2Vuc1swXTsKLQl9Ci0JCi0JLy8gVGhpcyBtZXRob2QgaXMgbmVlZGVkIGZvciB0aGUgZnV6enkgY29tcGFyZS4gTmVlZCB0byAKLQkvLyBzdHJpcCB0aGUgIi5qYXZhIiBvciAiLmNsYXNzIiBleHRlbnNpb24gb2ZmIG9mIHRoZSByZXNvdXJjZQotCS8vIG5hbWUgc28gdGhhdCB0aGUgY2xhc3MgbmFtZSBjYW4gYmUgc2VhcmNoZWQgZm9yIGluIHRoZSBtYXJrZXIncwotCS8vIGxvY2F0aW9uIHRleHQuCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2UoTWVzc2FnZU1ldGFEYXRhIG1tZCkgewotCQlTdHJpbmcgcmVzb3VyY2UgPSBtbWQuZ2V0UmVzb3VyY2UoKTsKLQkJaW50IGluZGV4ID0gcmVzb3VyY2UuaW5kZXhPZigiLmphdmEiKTsgLy8kTk9OLU5MUy0xJAotCQlpZihpbmRleCA+IC0xKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2Uuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQkKLQkJaW5kZXggPSByZXNvdXJjZS5pbmRleE9mKCIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlpZihpbmRleCA+IC0xKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2Uuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvcihJTWFya2VyIG1hcmtlcikgewotCQlTdHJpbmcgdmFsaWRhdG9yQ2xhc3MgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yKG1hcmtlcik7Ci0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JDbGFzcyk7Ci0JCXJldHVybiB2bWQ7Ci0JfQotCQotCS8qKgotCSAqIFBhcnNlIHRoZSBtZXNzYWdlIHZhbHVlLCB0byBleHRyYWN0IHRoZSB1bmlxdWUgZXJyb3IgaWQsIGlmIGFueS4KLQkgKiBTdHJpbmdbMF0gaXMgdGhlIG1lc3NhZ2UgcHJlZml4LCBTdHJpbmcgWzFdIGlzIHRoZSBlcnJvciBjaGFyLCBTdHJpbmdbMl0gaXMgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyBhZnRlciB0aGUgJzonCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBwYXJzZShTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIiLCAiIiwgIiJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWVzc2FnZSk7Ci0JCWludCBudW1Ub2tlbnMgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJaWYgKG51bVRva2VucyA9PSAwKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIiLCAiIiwgbWVzc2FnZX07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGVycm9ySWQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlib29sZWFuIGlzRXJyb3JJbmRleCA9IGZhbHNlOwotCi0JCQlpbnQgZXJyb3JJZEluZGV4ID0gZXJyb3JJZC5pbmRleE9mKCc6Jyk7Ci0JCQlpZiAoZXJyb3JJZEluZGV4ID4gMCkgewotCQkJCVN0cmluZyB0ZW1wU3RyaW5nID0gZXJyb3JJZC5zdWJzdHJpbmcoMCwgZXJyb3JJZEluZGV4KTsKLQkJCQljaGFyW10gdGVtcCA9IHRlbXBTdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJCQlpZiAodGVtcC5sZW5ndGggPT0gOSkgeyAvLyBNdXN0IGJlIG9mIHRoZSBmb3JtIEFCQ0QxMjM0RSwgd2hpY2ggaXMgOSBjaGFyIGxvbmcKLQotCQkJCQlpc0Vycm9ySW5kZXggPSBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFswXSk7Ci0JCQkJCWlzRXJyb3JJbmRleCA9IGlzRXJyb3JJbmRleCAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFsxXSk7Ci0JCQkJCWlzRXJyb3JJbmRleCA9IGlzRXJyb3JJbmRleCAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFsyXSk7Ci0JCQkJCWlzRXJyb3JJbmRleCA9IGlzRXJyb3JJbmRleCAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFszXSk7Ci0JCQkJCWlzRXJyb3JJbmRleCA9IGlzRXJyb3JJbmRleCAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzRdKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0RpZ2l0KHRlbXBbNV0pOwotCQkJCQlpc0Vycm9ySW5kZXggPSBpc0Vycm9ySW5kZXggJiYgQ2hhcmFjdGVyLmlzRGlnaXQodGVtcFs2XSk7Ci0JCQkJCWlzRXJyb3JJbmRleCA9IGlzRXJyb3JJbmRleCAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzddKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzhdKTsKLQotCQkJCQlpZiAoaXNFcnJvckluZGV4KSB7Ci0JCQkJCQlTdHJpbmcgc2hvcnRNZXNzYWdlOwotCQkJCQkJaWYgKG51bVRva2VucyA+IDEpIHsKLQkJCQkJCQlzaG9ydE1lc3NhZ2UgPSBtZXNzYWdlLnN1YnN0cmluZyhlcnJvcklkSW5kZXggKyAxLCBtZXNzYWdlLmxlbmd0aCgpKS5pbnRlcm4oKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXNob3J0TWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tde3RlbXBTdHJpbmcuc3Vic3RyaW5nKDAsIDgpLCBuZXcgU3RyaW5nKG5ldyBjaGFyW117dGVtcFs4XX0pLCBzaG9ydE1lc3NhZ2V9OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWlzRXJyb3JJbmRleCkgewotCQkJCXJldHVybiBuZXcgU3RyaW5nW117IiIsICIiLCBtZXNzYWdlfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBuZXcgU3RyaW5nW117IiIsICIiLCBtZXNzYWdlfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldExpbmVOdW1iZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSW50ZWdlciltYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0KElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgdGFyZ2V0T2JqZWN0ID0gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkFMSURBVElPTl9NQVJLRVJfVEFSR0VUT0JKRUNUKTsKLQkJCWlmKCh0YXJnZXRPYmplY3QgIT0gbnVsbCkgJiYgKHRhcmdldE9iamVjdC5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gRW1wdHkgc3RyaW5nIG1lYW5zIHRoYXQgdGhlcmUgd2FzIG5vIHRhcmdldCBvYmplY3QuCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gdGFyZ2V0T2JqZWN0OwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU29ydCBmaXJzdCBvbiB2YWxpZGF0b3IsIAotCSAqIHRoZW4gcHJvamVjdCwgCi0JICogdGhlbiBtZXNzYWdlIHByZWZpeCwKLQkgKiB0aGVuIGxvY2F0aW9uLAotCSAqIHRoZW4gcmVzb3VyY2UuIChUaGUgcmVzb3VyY2UgbWF5IGJlIGRpZmZlcmVudCBpbiBiYXRjaCBhbmQgVUksIHNvIGNvbXBhcmUgbG9jYXRpb24gJiByZXNvdXJjZSBhdCB0aGUgc2FtZSB0aW1lLikKLQkgKiAKLQkgKiBAcGFyYW0gdmVyYm9zZSBJZiB0cnVlLCB2ZXJib3NlIG91dHB1dCB3aGlsZSBjb21wYXJpbmcgbGlzdHMuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBnZXRNZXNzYWdlQ29tcGFyYXRvcihmaW5hbCBJQnVmZmVyIGJ1ZmZlciwgZmluYWwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCWlmKF9tZXNzYWdlQ29tcGFyYXRvciA9PSBudWxsKSB7Ci0JCQlfbWVzc2FnZUNvbXBhcmF0b3IgPSBuZXcgTWVzc2FnZVV0aWxpdHkoKS4gbmV3IE1lc3NhZ2VDb21wYXJhdG9yKCk7Ci0JCX0KLQkJX21lc3NhZ2VDb21wYXJhdG9yLnNldFZlcmJvc2UodmVyYm9zZSk7Ci0JCV9tZXNzYWdlQ29tcGFyYXRvci5zZXRCdWZmZXIoYnVmZmVyKTsKLQkJcmV0dXJuIF9tZXNzYWdlQ29tcGFyYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogU29ydCBmaXJzdCBvbiB0aGUgdmVyc2lvbiwgdGhlbiBvbiB0aGUgbWVzc2FnZSBwcmVmaXguCi0JICovCQotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBnZXRNZXNzYWdlSWRDb21wYXJhdG9yKGZpbmFsIElCdWZmZXIgYnVmZmVyLCBmaW5hbCBib29sZWFuIHZlcmJvc2UpIHsKLQkJaWYoX21lc3NhZ2VJZENvbXBhcmF0b3IgPT0gbnVsbCkgewotCQkJX21lc3NhZ2VJZENvbXBhcmF0b3IgPSBuZXcgTWVzc2FnZVV0aWxpdHkoKS4gbmV3IE1lc3NhZ2VJZENvbXBhcmF0b3IoKTsKLQkJfQotCQlfbWVzc2FnZUlkQ29tcGFyYXRvci5zZXRWZXJib3NlKHZlcmJvc2UpOwotCQlfbWVzc2FnZUlkQ29tcGFyYXRvci5zZXRCdWZmZXIoYnVmZmVyKTsKLQkJcmV0dXJuIF9tZXNzYWdlSWRDb21wYXJhdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2F0aW9uKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04pOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGUpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE1lc3NhZ2VDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBfdmVyYm9zZSA9IGZhbHNlOwotCQlwcml2YXRlIElCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKSB7Ci0JCQlyZXR1cm4gX3ZlcmJvc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2KSB7Ci0JCQlfdmVyYm9zZSA9IHY7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJCXJldHVybiBfYnVmZmVyOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoSUJ1ZmZlciBiKSB7Ci0JCQlfYnVmZmVyID0gYjsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKGIgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCQotCQkJCi0JCQkvLyBTb3J0IGZpcnN0IG9uIHRoZSBtZXNzYWdlIHByZWZpeCwgdGhlbiBvbiB0aGUgbG9jYXRpb24sIHRoZW4gcHJvamVjdCwgdGhlbiByZXNvdXJjZQotCQkJaWYoKGEgaW5zdGFuY2VvZiBTdHJpbmcpICYmIChiIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCXJldHVybiBjb21wYXJlKChTdHJpbmcpYSwgKFN0cmluZyliKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChhIGluc3RhbmNlb2YgSU1hcmtlcikgJiYgKGIgaW5zdGFuY2VvZiBJTWFya2VyKSkgewotCQkJCUlNYXJrZXIgYU0gPSAoSU1hcmtlcilhOwotCQkJCUlNYXJrZXIgYk0gPSAoSU1hcmtlciliOwotCQkJCWludCByZXN1bHQgPSBjb21wYXJlKGFNLCBiTSk7Ci0JCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUoImNvbXBhcmUoIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKGFNKSArICIsICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhiTSkgKyAiID0gIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQllbHNlIGlmICgoYSBpbnN0YW5jZW9mIElNYXJrZXIpICYmIChiIGluc3RhbmNlb2YgTWVzc2FnZU1ldGFEYXRhKSkgewotCQkJCUlNYXJrZXIgYU0gPSAoSU1hcmtlcilhOwotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSAoTWVzc2FnZU1ldGFEYXRhKWI7Ci0JCQkJaW50IHJlc3VsdCA9IGNvbXBhcmUoYU0sIG1tZCk7Ci0JCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUoImNvbXBhcmUoIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKGFNKSArICIsICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtbWQpICsgIiA9ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZWxzZSBpZigoYSBpbnN0YW5jZW9mIE1lc3NhZ2VNZXRhRGF0YSkgJiYgKGIgaW5zdGFuY2VvZiBJTWFya2VyKSkgewotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSAoTWVzc2FnZU1ldGFEYXRhKWE7Ci0JCQkJSU1hcmtlciBiTSA9IChJTWFya2VyKWI7Ci0JCQkJaW50IHJlc3VsdCA9IGNvbXBhcmUobW1kLCBiTSk7Ci0JCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUoImNvbXBhcmUoIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1tZCkgKyAiLCAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcoYk0pICsgIiA9ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0JCQkJCQkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZWxzZSBpZigoYSBpbnN0YW5jZW9mIE1lc3NhZ2VNZXRhRGF0YSkgJiYgKGIgaW5zdGFuY2VvZiBNZXNzYWdlTWV0YURhdGEpKSB7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIGFNTUQgPSAoTWVzc2FnZU1ldGFEYXRhKWE7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIGJNTUQgPSAoTWVzc2FnZU1ldGFEYXRhKWI7Ci0JCQkJaW50IHJlc3VsdCA9IGNvbXBhcmUoYU1NRCwgYk1NRCk7Ci0JCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUoImNvbXBhcmUoIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKGFNTUQpICsgIiwgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKGJNTUQpICsgIiA9ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJCi0JCQkvLyBlbHNlIHB1dCBpdCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBhU3RyLCBTdHJpbmcgYlN0cikgewotCQkJaWYoKGFTdHIgPT0gbnVsbCkgJiYgKGJTdHIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYVN0ciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKGJTdHIgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXJldHVybiBhU3RyLmNvbXBhcmVUbyhiU3RyKTsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlKGludCBhSW50LCBpbnQgYkludCkgewotCQkJcmV0dXJuIGFJbnQgLSBiSW50OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmFsaWRhdG9yTWV0YURhdGEgYVZNRCwgVmFsaWRhdG9yTWV0YURhdGEgYlZNRCkgewotCQkJaWYoKGFWTUQgPT0gbnVsbCkgJiYgKGJWTUQgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYVZNRCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKGJWTUQgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXJldHVybiBjb21wYXJlKGFWTUQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpLCBiVk1ELmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoSU1hcmtlciBhTWFya2VyLCBJTWFya2VyIGJNYXJrZXIpIHsKLQkJCWlmKChhTWFya2VyID09IG51bGwpICYmIChiTWFya2VyID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGFNYXJrZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZWxzZSBpZihiTWFya2VyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQkKLQkJCWludCB2YWxDbXAgPSBjb21wYXJlKGdldFZhbGlkYXRvcihhTWFya2VyKSwgZ2V0VmFsaWRhdG9yKGJNYXJrZXIpKTsKLQkJCWlmKHZhbENtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHZhbENtcDsKLQkJCX0KLQotCQkJaW50IHByakNtcCA9IGNvbXBhcmUoZ2V0UHJvamVjdChhTWFya2VyKSwgZ2V0UHJvamVjdChiTWFya2VyKSk7Ci0JCQlpZihwcmpDbXAgIT0gMCkgewotCQkJCXJldHVybiBwcmpDbXA7Ci0JCQl9Ci0JCQkKLQkJCWludCBpZENtcCA9IGNvbXBhcmUoZ2V0TWVzc2FnZVByZWZpeChhTWFya2VyKSwgZ2V0TWVzc2FnZVByZWZpeChiTWFya2VyKSk7Ci0JCQlpZihpZENtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIGlkQ21wOwotCQkJfQotCi0JCQlpbnQgY21wID0gY29tcGFyZVJlc291cmNlQW5kTG9jYXRpb24oYU1hcmtlciwgYk1hcmtlcik7Ci0JCQlyZXR1cm4gY21wOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoSU1hcmtlciBtYXJrZXIsIE1lc3NhZ2VNZXRhRGF0YSBtbWQpIHsKLQkJCWlmKChtYXJrZXIgPT0gbnVsbCkgJiYgKG1tZCA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihtYXJrZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZWxzZSBpZihtbWQgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJaW50IHZhbENtcCA9IGNvbXBhcmUoZ2V0VmFsaWRhdG9yKG1hcmtlciksIG1tZC5nZXRWYWxpZGF0b3IoKSk7Ci0JCQlpZih2YWxDbXAgIT0gMCkgewotCQkJCXJldHVybiB2YWxDbXA7Ci0JCQl9Ci0KLQkJCWludCBwcmpDbXAgPSBjb21wYXJlKGdldFByb2plY3QobWFya2VyKSwgbW1kLmdldFZhbGlkYXRvclRlc3RjYXNlKCkuZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCQlpZihwcmpDbXAgIT0gMCkgewotCQkJCXJldHVybiBwcmpDbXA7Ci0JCQl9Ci0JCQkKLQkJCWludCBpZENtcCA9IGNvbXBhcmUoZ2V0TWVzc2FnZVByZWZpeChtYXJrZXIpLCBtbWQuZ2V0TWVzc2FnZVByZWZpeCgpKTsKLQkJCWlmKGlkQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gaWRDbXA7Ci0JCQl9Ci0KLQkJCWludCBjbXAgPSBjb21wYXJlUmVzb3VyY2VBbmRMb2NhdGlvbihtYXJrZXIsIG1tZCk7Ci0JCQlyZXR1cm4gY21wOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoTWVzc2FnZU1ldGFEYXRhIG1tZCwgSU1hcmtlciBtYXJrZXIpIHsKLQkJCWlmKChtbWQgPT0gbnVsbCkgJiYgKG1hcmtlciA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihtbWQgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZWxzZSBpZihtYXJrZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJaW50IHZhbENtcCA9IGNvbXBhcmUobW1kLmdldFZhbGlkYXRvcigpLCBnZXRWYWxpZGF0b3IobWFya2VyKSk7Ci0JCQlpZih2YWxDbXAgIT0gMCkgewotCQkJCXJldHVybiB2YWxDbXA7Ci0JCQl9Ci0KLQkJCWludCBwcmpDbXAgPSBjb21wYXJlKG1tZC5nZXRWYWxpZGF0b3JUZXN0Y2FzZSgpLmdldFByb2plY3ROYW1lKCksIGdldFByb2plY3QobWFya2VyKSk7Ci0JCQlpZihwcmpDbXAgIT0gMCkgewotCQkJCXJldHVybiBwcmpDbXA7Ci0JCQl9Ci0KLQkJCWludCBpZENtcCA9IGNvbXBhcmUobW1kLmdldE1lc3NhZ2VQcmVmaXgoKSwgZ2V0TWVzc2FnZVByZWZpeChtYXJrZXIpKTsKLQkJCWlmKGlkQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gaWRDbXA7Ci0JCQl9Ci0KLQkJCWludCBjbXAgPSBjb21wYXJlUmVzb3VyY2VBbmRMb2NhdGlvbihtbWQsIG1hcmtlcik7Ci0JCQlyZXR1cm4gY21wOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoTWVzc2FnZU1ldGFEYXRhIGFNTUQsIE1lc3NhZ2VNZXRhRGF0YSBiTU1EKSB7Ci0JCQlpZigoYU1NRCA9PSBudWxsKSAmJiAoYk1NRCA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhTU1EID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYk1NRCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJCi0JCQlpbnQgdmFsQ21wID0gY29tcGFyZShhTU1ELmdldFZhbGlkYXRvcigpLCBiTU1ELmdldFZhbGlkYXRvcigpKTsKLQkJCWlmKHZhbENtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHZhbENtcDsKLQkJCX0KLQotCQkJaW50IHByakNtcCA9IGNvbXBhcmUoYU1NRC5nZXRWYWxpZGF0b3JUZXN0Y2FzZSgpLmdldFByb2plY3ROYW1lKCksIGJNTUQuZ2V0VmFsaWRhdG9yVGVzdGNhc2UoKS5nZXRQcm9qZWN0TmFtZSgpKTsKLQkJCWlmKHByakNtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHByakNtcDsKLQkJCX0KLQkJCQotCQkJaW50IGlkQ21wID0gY29tcGFyZShhTU1ELmdldE1lc3NhZ2VQcmVmaXgoKSwgYk1NRC5nZXRNZXNzYWdlUHJlZml4KCkpOwotCQkJaWYoaWRDbXAgIT0gMCkgewotCQkJCXJldHVybiBpZENtcDsKLQkJCX0KLQotCQkJaW50IGNtcCA9IGNvbXBhcmVSZXNvdXJjZUFuZExvY2F0aW9uKGFNTUQsIGJNTUQpOwotCQkJcmV0dXJuIGNtcDsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlUmVzb3VyY2VBbmRMb2NhdGlvbihJTWFya2VyIGFNYXJrZXIsIElNYXJrZXIgYk1hcmtlcikgewotCQkJaW50IHJlc0NtcCA9IGNvbXBhcmUoZ2V0UmVzb3VyY2UoYU1hcmtlciksIGdldFJlc291cmNlKGJNYXJrZXIpKTsKLQkJCWlmKHJlc0NtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHJlc0NtcDsKLQkJCX0KLQkJCQotCQkJSW50ZWdlciBhTGluZU5vID0gZ2V0TGluZU51bWJlcihhTWFya2VyKTsKLQkJCUludGVnZXIgYkxpbmVObyA9IGdldExpbmVOdW1iZXIoYk1hcmtlcik7Ci0JCQlpZigoYUxpbmVObyAhPSBudWxsKSAmJiAoYkxpbmVObyE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGNvbXBhcmUoYUxpbmVObywgYkxpbmVObyk7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBhTG9jYXRpb24gPSBnZXRMb2NhdGlvbihhTWFya2VyKTsKLQkJCVN0cmluZyBiTG9jYXRpb24gPSBnZXRMb2NhdGlvbihiTWFya2VyKTsKLQkJCWlmKChhTG9jYXRpb24gIT0gbnVsbCkgJiYgKGJMb2NhdGlvbiAhPSBudWxsKSkgewotCQkJCXJldHVybiBjb21wYXJlKGFMb2NhdGlvbiwgYkxvY2F0aW9uKTsKLQkJCX0KLQkJCQotCQkJLy8gSWYgb25lIGhhcyBhIGxpbmUgbnVtYmVyIGFuZCB0aGUgb3RoZXIgaGFzIGEgdGV4dCBsb2NhdGlvbiwgY2FuJ3QgY29tcGFyZQotCQkJLy8gdGhlIGxvY2F0aW9uLCBzbyBqdXN0IGFzc3VtZSB0aGF0IHRoZXkncmUgZXF1YWwuCi0JCQlyZXR1cm4gcmVzQ21wOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmVSZXNvdXJjZUFuZExvY2F0aW9uKElNYXJrZXIgbWFya2VyLCBNZXNzYWdlTWV0YURhdGEgbW1kKSB7Ci0JCQlpbnQgcmVzQ21wID0gY29tcGFyZShnZXRSZXNvdXJjZShtYXJrZXIpLCBtbWQuZ2V0UmVzb3VyY2UoKSk7Ci0JCQlpZihyZXNDbXAgIT0gMCkgewotCQkJCXJldHVybiByZXNDbXA7Ci0JCQl9Ci0JCQkKLQkJCWlmKG1tZC5pc1NldExpbmVOdW1iZXIoKSkgewotCQkJCUludGVnZXIgYUxpbmVObyA9IGdldExpbmVOdW1iZXIobWFya2VyKTsKLQkJCQlpbnQgYkxpbmVObyA9IG1tZC5nZXRMaW5lTnVtYmVyKCk7Ci0JCQkJaWYoYUxpbmVObyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBjb21wYXJlKGFMaW5lTm8uaW50VmFsdWUoKSwgYkxpbmVObyk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZihtbWQuaXNTZXRMb2NhdGlvbigpKSB7Ci0JCQkJU3RyaW5nIGFMb2NhdGlvbiA9IGdldExvY2F0aW9uKG1hcmtlcik7Ci0JCQkJU3RyaW5nIGJMb2NhdGlvbiA9IG1tZC5nZXRMb2NhdGlvbigpOwotCQkJCWlmKChhTG9jYXRpb24gIT0gbnVsbCkgJiYgKGJMb2NhdGlvbiAhPSBudWxsKSkgewotCQkJCQlyZXR1cm4gY29tcGFyZShhTG9jYXRpb24sIGJMb2NhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBJZiBvbmUgaGFzIGEgbGluZSBudW1iZXIgYW5kIHRoZSBvdGhlciBoYXMgYSB0ZXh0IGxvY2F0aW9uLCBjYW4ndCBjb21wYXJlCi0JCQkvLyB0aGUgbG9jYXRpb24sIHNvIGp1c3QgYXNzdW1lIHRoYXQgdGhleSdyZSBlcXVhbC4KLQkJCXJldHVybiByZXNDbXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZVJlc291cmNlQW5kTG9jYXRpb24oTWVzc2FnZU1ldGFEYXRhIG1tZCwgSU1hcmtlciBtYXJrZXIpIHsKLQkJCWludCByZXNDbXAgPSBjb21wYXJlKG1tZC5nZXRSZXNvdXJjZSgpLCBnZXRSZXNvdXJjZShtYXJrZXIpKTsKLQkJCWlmKHJlc0NtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHJlc0NtcDsKLQkJCX0KLQotCQkJaWYobW1kLmlzU2V0TGluZU51bWJlcigpKSB7Ci0JCQkJaW50IGFMaW5lTm8gPSBtbWQuZ2V0TGluZU51bWJlcigpOwotCQkJCUludGVnZXIgYkxpbmVObyA9IGdldExpbmVOdW1iZXIobWFya2VyKTsKLQkJCQlpZihiTGluZU5vIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gY29tcGFyZShhTGluZU5vLCBiTGluZU5vLmludFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYobW1kLmlzU2V0TG9jYXRpb24oKSkgewotCQkJCVN0cmluZyBhTG9jYXRpb24gPSBtbWQuZ2V0TG9jYXRpb24oKTsKLQkJCQlTdHJpbmcgYkxvY2F0aW9uID0gZ2V0TG9jYXRpb24obWFya2VyKTsKLQkJCQlpZigoYUxvY2F0aW9uICE9IG51bGwpICYmIChiTG9jYXRpb24gIT0gbnVsbCkpIHsKLQkJCQkJcmV0dXJuIGNvbXBhcmUoYUxvY2F0aW9uLCBiTG9jYXRpb24pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gSWYgb25lIGhhcyBhIGxpbmUgbnVtYmVyIGFuZCB0aGUgb3RoZXIgaGFzIGEgdGV4dCBsb2NhdGlvbiwgY2FuJ3QgY29tcGFyZQotCQkJLy8gdGhlIGxvY2F0aW9uLCBzbyBqdXN0IGFzc3VtZSB0aGF0IHRoZXkncmUgZXF1YWwuCi0JCQlyZXR1cm4gcmVzQ21wOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmVSZXNvdXJjZUFuZExvY2F0aW9uKE1lc3NhZ2VNZXRhRGF0YSBhTU1ELCBNZXNzYWdlTWV0YURhdGEgYk1NRCkgewotCQkJaW50IHJlc0NtcCA9IGNvbXBhcmUoYU1NRC5nZXRSZXNvdXJjZSgpLCBiTU1ELmdldFJlc291cmNlKCkpOwotCQkJaWYocmVzQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gcmVzQ21wOwotCQkJfQotCi0JCQlpZihhTU1ELmlzU2V0TGluZU51bWJlcigpICYmIGJNTUQuaXNTZXRMaW5lTnVtYmVyKCkpIHsKLQkJCQlpbnQgYUxpbmVObyA9IGFNTUQuZ2V0TGluZU51bWJlcigpOwotCQkJCWludCBiTGluZU5vID0gYk1NRC5nZXRMaW5lTnVtYmVyKCk7Ci0JCQkJcmV0dXJuIGNvbXBhcmUoYUxpbmVObywgYkxpbmVObyk7Ci0JCQl9Ci0KLQkJCWlmKGFNTUQuaXNTZXRMb2NhdGlvbigpICYmIGJNTUQuaXNTZXRMb2NhdGlvbigpKSB7Ci0JCQkJU3RyaW5nIGFMb2NhdGlvbiA9IGFNTUQuZ2V0TG9jYXRpb24oKTsKLQkJCQlTdHJpbmcgYkxvY2F0aW9uID0gYk1NRC5nZXRMb2NhdGlvbigpOwotCQkJCWlmKChhTG9jYXRpb24gIT0gbnVsbCkgJiYgKGJMb2NhdGlvbiAhPSBudWxsKSkgewotCQkJCQlyZXR1cm4gY29tcGFyZShhTG9jYXRpb24sIGJMb2NhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBJZiBvbmUgaGFzIGEgbGluZSBudW1iZXIgYW5kIHRoZSBvdGhlciBoYXMgYSB0ZXh0IGxvY2F0aW9uLCBjYW4ndCBjb21wYXJlCi0JCQkvLyB0aGUgbG9jYXRpb24sIHNvIGp1c3QgYXNzdW1lIHRoYXQgdGhleSdyZSBlcXVhbC4KLQkJCXJldHVybiByZXNDbXA7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXNzYWdlUHJlZml4Q29tcGFyYXRvciBnZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpIHsKLQkJaWYoX21lc3NhZ2VQcmVmaXhDb21wYXJhdG9yID09IG51bGwpIHsKLQkJCV9tZXNzYWdlUHJlZml4Q29tcGFyYXRvciA9IG5ldyBNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpOwotCQl9Ci0JCXJldHVybiBfbWVzc2FnZVByZWZpeENvbXBhcmF0b3I7Ci0JfQotCQotCXN0YXRpYyBjbGFzcyBNZXNzYWdlUHJlZml4Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlTdHJpbmcgYVByZWZpeCA9IG51bGw7Ci0JCQlTdHJpbmcgYlByZWZpeCA9IG51bGw7Ci0JCQlpZihhIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSB7Ci0JCQkJYVByZWZpeCA9ICgoUHJvcGVydHlMaW5lKWEpLmdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJCX0KLQkJCWVsc2UgaWYoYSBpbnN0YW5jZW9mIE1lc3NhZ2VNZXRhRGF0YSkgewotCQkJCWFQcmVmaXggPSAoKE1lc3NhZ2VNZXRhRGF0YSlhKS5nZXRNZXNzYWdlUHJlZml4KCk7Ci0JCQl9Ci0JCQkKLQkJCWlmKGIgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCQliUHJlZml4ID0gKChQcm9wZXJ0eUxpbmUpYikuZ2V0TWVzc2FnZVByZWZpeCgpOwotCQkJfQotCQkJZWxzZSBpZihiIGluc3RhbmNlb2YgTWVzc2FnZU1ldGFEYXRhKSB7Ci0JCQkJYlByZWZpeCA9ICgoTWVzc2FnZU1ldGFEYXRhKWIpLmdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJCX0KLQotCQkJaWYoYVByZWZpeC5sZW5ndGgoKSA9PSA5KSB7Ci0JCQkJYVByZWZpeCA9IGFQcmVmaXguc3Vic3RyaW5nKDAsIDkpOwotCQkJfQotCQkJCi0JCQlpZihiUHJlZml4Lmxlbmd0aCgpID09IDkpIHsKLQkJCQliUHJlZml4ID0gYlByZWZpeC5zdWJzdHJpbmcoMCwgOSk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBhUHJlZml4LmNvbXBhcmVUbyhiUHJlZml4KTsKLQkJfQotCX0KLQkJCi0JY2xhc3MgTWVzc2FnZUlkQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwcml2YXRlIGJvb2xlYW4gX3ZlcmJvc2UgPSBmYWxzZTsKLQkJcHJpdmF0ZSBJQnVmZmVyIF9idWZmZXIgPSBudWxsOwotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNWZXJib3NlKCkgewotCQkJcmV0dXJuIF92ZXJib3NlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdikgewotCQkJX3ZlcmJvc2UgPSB2OwotCQl9Ci0JCQotCQlwdWJsaWMgSUJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCQlyZXR1cm4gX2J1ZmZlcjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYikgewotCQkJX2J1ZmZlciA9IGI7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkKElNYXJrZXIgbWFya2VyKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoU3RyaW5nKW1hcmtlci5nZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WQUxJREFUSU9OX01BUktFUl9NRVNTQUdFSUQpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBhU3RyLCBTdHJpbmcgYlN0cikgewotCQkJaWYoKGFTdHIgPT0gbnVsbCkgJiYgKGJTdHIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYVN0ciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKGJTdHIgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXJldHVybiBhU3RyLmNvbXBhcmVUbyhiU3RyKTsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKGIgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCQotCQkJCi0JCQkvLyBTb3J0IGZpcnN0IG9uIHRoZSB2ZXJzaW9uLCB0aGVuIG9uIHRoZSBtZXNzYWdlIHByZWZpeAotCQkJaWYoKGEgaW5zdGFuY2VvZiBTdHJpbmcpICYmIChiIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCVN0cmluZyBhU3RyID0gKFN0cmluZylhOwotCQkJCVN0cmluZyBiU3RyID0gKFN0cmluZyliOwotCQkJCXJldHVybiBjb21wYXJlKGFTdHIsIGJTdHIpOwotCQkJfQotCQkJZWxzZSBpZiAoKGEgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpICYmIChiIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSkgewotCQkJCVByb3BlcnR5TGluZSBhTSA9IChQcm9wZXJ0eUxpbmUpYTsKLQkJCQlQcm9wZXJ0eUxpbmUgYk0gPSAoUHJvcGVydHlMaW5lKWI7Ci0JCQkJCi0JCQkJcmV0dXJuIGNvbXBhcmUoYU0uZ2V0TWVzc2FnZUlkKCksIGJNLmdldE1lc3NhZ2VJZCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChhIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSAmJiAoYiBpbnN0YW5jZW9mIElNYXJrZXIpKSB7Ci0JCQkJUHJvcGVydHlMaW5lIGFNID0gKFByb3BlcnR5TGluZSlhOwotCQkJCUlNYXJrZXIgYk0gPSAoSU1hcmtlciliOwotCQkJCQotCQkJCXJldHVybiBjb21wYXJlKGFNLmdldE1lc3NhZ2VJZCgpLCBnZXRNZXNzYWdlSWQoYk0pKTsKLQkJCX0KLQkJCWVsc2UgaWYoKGEgaW5zdGFuY2VvZiBJTWFya2VyKSAmJiAoYiBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkpIHsKLQkJCQlJTWFya2VyIGFNID0gKElNYXJrZXIpYTsKLQkJCQlQcm9wZXJ0eUxpbmUgYk0gPSAoUHJvcGVydHlMaW5lKWI7Ci0JCQkJCi0JCQkJcmV0dXJuIGNvbXBhcmUoZ2V0TWVzc2FnZUlkKGFNKSwgYk0uZ2V0TWVzc2FnZUlkKCkpOwotCQkJfQotCQkJZWxzZSBpZigoYSBpbnN0YW5jZW9mIElNYXJrZXIpICYmIChiIGluc3RhbmNlb2YgSU1hcmtlcikpIHsKLQkJCQlJTWFya2VyIGFNID0gKElNYXJrZXIpYTsKLQkJCQlJTWFya2VyIGJNID0gKElNYXJrZXIpYjsKLQotCQkJCXJldHVybiBjb21wYXJlKGdldE1lc3NhZ2VJZChhTSksIGdldE1lc3NhZ2VJZChiTSkpOwotCQkJfQotCQkJCi0JCQkvLyBlbHNlIHB1dCBpdCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX07Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9PcGVyYXRpb25UZXN0Y2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvT3BlcmF0aW9uVGVzdGNhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjYzQ0YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9PcGVyYXRpb25UZXN0Y2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5JT3BlcmF0aW9uUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotCi0vKioKLSAqIEluc3RlYWQgb2YgdGVzdGluZyBhIHZhbGlkYXRvciwgYW4gb3BlcmF0aW9uIHRlc3QgY2FzZSB0ZXN0cyB0aGUgCi0gKiB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvblRlc3RjYXNlIGltcGxlbWVudHMgSVRlc3RjYXNlTWV0YURhdGEgewotCXByaXZhdGUgU3RyaW5nIF9wbHVnaW5JZCA9IG51bGw7IC8vIFRoZSBwbHVnaW4gaWQgdGhhdCBoYXMgY29udHJpYnV0ZWQgdGhpcyB0ZXN0IGNhc2UuCi0JcHJpdmF0ZSBTdHJpbmcgX3Byb2plY3ROYW1lID0gbnVsbDsgLy8gdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGlzIHRlc3QgY2FzZSB0ZXN0cwotCXByaXZhdGUgU3RyaW5nIF9pbnB1dEZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfb3BOYW1lID0gbnVsbDsgLy8gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotCXByaXZhdGUgSU9wZXJhdGlvblJ1bm5hYmxlIF9ydW5uYWJsZSA9IG51bGw7Ci0KLQlwdWJsaWMgT3BlcmF0aW9uVGVzdGNhc2UoU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBvcE5hbWUsIFN0cmluZyBpbnB1dEZpbGVOYW1lLCBJT3BlcmF0aW9uUnVubmFibGUgcnVubmFibGUpIHsKLQkJX3BsdWdpbklkID0gcGx1Z2luSWQ7Ci0JCV9wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCQlfaW5wdXRGaWxlTmFtZSA9IGlucHV0RmlsZU5hbWU7Ci0JCV9vcE5hbWUgPSBvcE5hbWU7Ci0JCV9ydW5uYWJsZSA9IHJ1bm5hYmxlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBfb3BOYW1lOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0JCXJldHVybiB0cnVlOyAvLyBmcmFtZXdvcmsgdGVzdCBjYXNlcyBhcmUgYWx3YXlzIHZpc2libGUgb24gdGhlIHRlc3QgY29sbGVjdG9yIG1lbnUKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIF9wbHVnaW5JZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0TmFtZTsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBUZXN0Y2FzZVV0aWxpdHkuZmluZFByb2plY3QodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9pbnB1dEZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgSU9wZXJhdGlvblJ1bm5hYmxlIGdldFJ1bm5hYmxlKCkgewotCQlyZXR1cm4gX3J1bm5hYmxlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LklUZXN0Y2FzZU1ldGFEYXRhI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyLCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUJ1ZmZlciBidWZmZXIsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWdldFJ1bm5hYmxlKCkuc2V0QnVmZmVyKGJ1ZmZlcik7Ci0JCQlnZXRSdW5uYWJsZSgpLnNldFByb2plY3QocHJvamVjdCk7Ci0JCQlnZXRSdW5uYWJsZSgpLnNldE5hbWUoZ2V0TmFtZSgpKTsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oZ2V0UnVubmFibGUoKSwgYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvUmVnaXN0cnlDb25zdGFudHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1JlZ2lzdHJ5Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDAzMmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvUmVnaXN0cnlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotLyoqCi0gKiBWYWxpZGF0aW9uIGNvbnN0YW50cyBuZWVkZWQgdG8gZGVjbGFyZSBhbiBleHRlbnNpb24gcG9pbnQsIGFuZAotICogdG8gaW1wbGVtZW50IGFuIGV4dGVuc2lvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWdpc3RyeUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfVEVTVENBU0VfRVhUX1BUX0lEID0gInRlc3QiOyAvLyBleHRlbnNpb24gcG9pbnQgZGVjbGFyYXRpb24gb2YgdGhlIHZhbGlkYXRvciB0ZXN0IGNhc2UgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9TRVRVUF9FWFRfUFRfSUQgPSAidGVzdFNldHVwIjsgLy8gZXh0ZW5zaW9uIHBvaW50IGRlY2xhcmF0aW9uIG9mIHRoZSB0ZXN0IGNhc2Ugc2V0dXAgbWVjaGFuaXNtIChpLmUuLCBpbXBvcnQgdGhlIEVBUiBvciBKQVIpIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfT1BFUkFUSU9OX1RFU1RDQVNFX0VYVF9QVF9JRCA9ICJvcFRlc3QiOyAvLyBleHRlbnNpb24gcG9pbnQgZGVjbGFyYXRpb24gb2YgdGhlIG9wZXJhdGlvbiB0ZXN0IGNhc2UgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG91YmxlIEVKQjIwID0gbmV3IERvdWJsZSgyLjApOyAvLyBFSkIgMi4wIGlucHV0IG9yIDEuMyBFQVIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERvdWJsZSBFSkIxMSA9IG5ldyBEb3VibGUoMS4xKTsgLy8gRUpCIDEuMSBpbnB1dCBvciAxLjIgRUFSCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEb3VibGUgRUpCID0gbnVsbDsgLy8gY29tbW9uIEVKQiBsZXZlbCwgc3VjaCBhcyByZWZsZWN0aW9uIGVycm9ycwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQjIwX01TU0cgPSAiZWpiMjAiOyAvLyBpbiBhIC5wcm9wZXJ0aWVzIGxpbmUsIGlmIHRoZSBtZXNzYWdlIGlkIGNvbnRhaW5zIHRoaXMgc3RyaW5nLCBpdCdzIGFuIEVKQiAyLjAgcnVsZSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCMTFfTVNTRyA9ICJlamIxMSI7IC8vIGluIGEgLnByb3BlcnRpZXMgbGluZSwgaWYgdGhlIG1lc3NhZ2UgaWQgY29udGFpbnMgdGhpcyBzdHJpbmcsIGl0J3MgYW4gRUpCIDEuMSBydWxlIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfTVNTRyA9IG51bGw7IC8vIGluIGEgLnByb3BlcnRpZXMgZmlsZSwgaWYgdGhlIG1lc3NhZ2UgaXMgbmVpdGhlciBFSkIyMCBub3IgRUpCMTEsIHRoZSBydWxlIGlzIGNyb3NzLXNwZWNzLiAoZS5nLiByZWZsZWN0aW9uIGVycm9ycykgLy8kTk9OLU5MUy0xJAotCQotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVkFMSURBVE9SID0gInZhbGlkYXRvciI7IC8vIHRoZSB2YWxpZGF0b3IgIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QTFVHSU4gPSAicGx1Z2luIjsgLy8gaWRlbnRpZmllcyB0aGUgcGx1Z2luIHdoaWNoIGhhcyB0aGUgY2xhc3MgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RFU1QgPSAidGVzdCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JTVBPUlQgPSAiaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX09QRVJBVElPTiA9ICJvcGVyYXRpb24iOyAvLyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIElJbXBvcnRPcGVyYXRpb24gd2hpY2ggaXMgdXNlZCB0byBpbXBvcnQgdGhlIGlucHV0IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JTlBVVCA9ICJpbnB1dCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9WRVJTSU9OID0gInZlcnNpb24iOyAvLyB0aGUgdmVyc2lvbiBvZiB0aGUgaW5wdXQsIGUuZy4gRUpCIDEuMSB2cy4gRUpCIDIuMCAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTUVTU0FHRSA9ICJtZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BSRUZJWCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU0VWRVJJVFkgPSAic2V2ZXJpdHkiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFJPSkVDVCA9ICJwcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1JFU09VUkNFID0gInJlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9WSVNJQkxFID0gInZpc2libGUiOyAvLyBJcyB0aGlzIHRlc3QgdmlzaWJsZSBvbiB0aGUgVGVzdCBDb2xsZWN0b3IgbWVudT8gLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVGVzdFNldHVwSW1wb3J0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0U2V0dXBJbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4NTllYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0U2V0dXBJbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JSW1wb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIG1ldGFkYXRhIG5lZWRlZCB0byBpbXBvcnQgYW4gLmVhciBvcgotICogYSAuamFyIGZpbGUgdG8gc2V0IHVwIGEgdGVzdCBjYXNlIGluIGJhdGNoIG1vZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0U2V0dXBJbXBvcnQgewotCXByaXZhdGUgU3RyaW5nIF9maWxlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBJSW1wb3J0T3BlcmF0aW9uIF9pbXBvcnRPcGVyYXRpb24gPSBudWxsOwotCi0JcHVibGljIFRlc3RTZXR1cEltcG9ydChJSW1wb3J0T3BlcmF0aW9uIG9wLCBTdHJpbmcgZmlsZU5hbWUpIHsKLQkJX2ltcG9ydE9wZXJhdGlvbiA9IG9wOwotCQlfZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRJbnB1dEZpbGUoU3RyaW5nIGRpcikgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGdldEZpbGVOYW1lKCkpOwotCQlpZighZmlsZS5leGlzdHMoKSkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJGaWxlICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiBtdXN0IGV4aXN0IGFuZCBoYXZlIHJlYWQgYWNjZXNzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9maWxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIElJbXBvcnRPcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gX2ltcG9ydE9wZXJhdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgd2FzIGZvdW5kIGFuZCBpbXBvcnRlZCBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW1wb3J0RmlsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBkaXIpIHsKLQkJaW50IGV4ZWN1dGlvbk1hcCA9IDB4MDsKLQkJYm9vbGVhbiBpbXBvcnRlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRJbnB1dEZpbGUoZGlyKTsKLQkJCWV4ZWN1dGlvbk1hcCB8PSAweDE7Ci0JCQl0cnkgewotCQkJCUlJbXBvcnRPcGVyYXRpb24gb3AgPSBnZXRPcGVyYXRpb24oKTsKLQkJCQlleGVjdXRpb25NYXAgfD0gMHgyOwotCQkJCWltcG9ydGVkID0gb3AucnVuKG1vbml0b3IsIGZpbGUpOwotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDQ7Ci0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4ODsKLQkJCQlpbXBvcnRlZCA9IGZhbHNlOwotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCQl9Ci0JCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlleGVjdXRpb25NYXAgfD0gMHgxMDsKLQkJCQlpbXBvcnRlZCA9IGZhbHNlOwotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCX0KLQkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4MjA7Ci0JCQkJaW1wb3J0ZWQgPSBmYWxzZTsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoIWltcG9ydGVkKSB7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIAotCQkJCQkJIlRlc3RTZXR1cCBmb3IgIiArIGRpciArICIgd2FzIHVuc3VjY2Vzc2Z1bC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gaW1wb3J0ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVGVzdGNhc2VNZXRhRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVGVzdGNhc2VNZXRhRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGYyYzU2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1Rlc3RjYXNlTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotCi1wdWJsaWMgY2xhc3MgVGVzdGNhc2VNZXRhRGF0YSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX3BsdWdpbklkID0gbnVsbDsgLy8gVGhlIHBsdWdpbiBpZCB0aGF0IGhhcyBjb250cmlidXRlZCB0aGlzIHRlc3QgY2FzZS4KLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIF92bWQgPSBudWxsOwotCXByaXZhdGUgTWVzc2FnZU1ldGFEYXRhW10gX21lc3NhZ2VzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcHJvamVjdCA9IG51bGw7IC8vIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRoYXQgdGhpcyB0ZXN0IGNhc2UgdGVzdHMKLQlwcml2YXRlIFN0cmluZ1tdIF9yZXNvdXJjZU5hbWVzID0gbnVsbDsgLy8gdGhlIHJlc291cmNlcyBsaXN0ZWQgaW4gdGhlIE1lc3NhZ2VNZXRhRGF0YSBvZiB0aGlzIHRlc3QgY2FzZS4KLQlwcml2YXRlIFN0cmluZyBfaW5wdXRGaWxlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX25hbWUgPSBudWxsOyAvLyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0JCi0JcHVibGljIFRlc3RjYXNlTWV0YURhdGEoU3RyaW5nIHBsdWdpbk5hbWUsIFN0cmluZyBwcm9qZWN0LCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIFN0cmluZyBpbnB1dEZpbGVOYW1lKSB7Ci0JCV9wbHVnaW5JZCA9IHBsdWdpbk5hbWU7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQkJX3ZtZCA9IHZtZDsKLQkJX2lucHV0RmlsZU5hbWUgPSBpbnB1dEZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlY2xhcmluZ1BsdWdpbklkKCkgewotCQlyZXR1cm4gX3BsdWdpbklkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBfcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGZpbmRQcm9qZWN0KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KF9wcm9qZWN0KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKCkgewotCQlyZXR1cm4gX2lucHV0RmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TnVtTWVzc2FnZXMoKSB7Ci0JCXJldHVybiBnZXRNZXNzYWdlcygpLnNpemUoKTsKLQl9Ci0JCi0JLy8gVGhlIG1lc3NhZ2VzIG5lZWQgdG8gYmUgc3RvcmVkIGluIGEgbGlzdCBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UKLQkvLyB0aGUgbGlzdCBpcyBzb3J0ZWQgYmVmb3JlIHNlYXJjaGluZyAmIGRpc3BsYXlpbmcuCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKSB7Ci0JCUxpc3QgY29weSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKGludCBpPTA7IGk8X21lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb3B5LmFkZChfbWVzc2FnZXNbaV0pOwotCQl9Ci0JCQotCQlyZXR1cm4gY29weTsKLQl9Ci0JCi0JLy8gUmV0dXJuIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBwcm9qZWN0IGZvciB3aGljaCB0aGVyZSBpcyBhIG1lc3NhZ2UgaW4gdGhpcyB0ZXN0IGNhc2UuCi0JLy8gTm8gcmVzb3VyY2UgaW5zdGFuY2Ugd2lsbCBiZSBpbiB0aGUgcmVzb3VyY2UgbW9yZSB0aGFuIG9uY2UuCi0JcHVibGljIElSZXNvdXJjZVtdIGdldFJlc291cmNlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVNldCB0ZW1wID0gbmV3IEhhc2hTZXQoKTsgLy8gdXNlIGEgc2V0IGluIGNhc2UgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBtZXNzYWdlIHJlZ2lzdGVyZWQgYWdhaW5zdCBhIHJlc291cmNlIChkb24ndCB3YW50IGR1cGxpY2F0ZXMgaW4gdGhlIGxpc3QpLgotCQlTdHJpbmdbXSByZXNvdXJjZU5hbWVzID0gZ2V0UmVzb3VyY2VOYW1lcygpOwotCQlmb3IoaW50IGk9MDsgaTxyZXNvdXJjZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lc1tpXTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHByb2plY3QuZmluZE1lbWJlcihyZXNvdXJjZU5hbWUpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCS8vIHJlc291cmNlIGV4aXN0cwotCQkJCXRlbXAuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQkKLQkJSVJlc291cmNlW10gcmVzdWx0ID0gbmV3IElSZXNvdXJjZVt0ZW1wLnNpemUoKV07Ci0JCXRlbXAudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VOYW1lcygpIHsKLQkJaWYoX3Jlc291cmNlTmFtZXMgPT0gbnVsbCkgewotCQkJX3Jlc291cmNlTmFtZXMgPSBuZXcgU3RyaW5nW19tZXNzYWdlcy5sZW5ndGhdOwotCQkJZm9yKGludCBpPTA7IGk8X21lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJX3Jlc291cmNlTmFtZXNbaV0gPSBfbWVzc2FnZXNbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gX3Jlc291cmNlTmFtZXM7Ci0JfQotCQotCS8qKgotCSAqIFdoZW4gYW4gZW1wdHkgVE1EIGlzIHVzZWQgdG8gdGVzdCBhbiBvcGVyYXRpb24sIGFuZCB0aGUgb3BlcmF0aW9uIG5lZWRzIHRoZSBJUmVzb3VyY2VbXQotCSAqIGFmZmVjdGVkIGJ5IHRoZSBUTUQgdG8ga25vdyB3aGV0aGVyIG9yIG5vdCB0aGUgb3BlcmF0aW9uIHBhc3NlcyAoaS5lLiwgb25lIG9mIHRoZSBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24KLQkgKiBjb25zdHJ1Y3RvcnMgdGFrZXMgYW4gSVJlc291cmNlW10sIGFuZCB0aGUgSVJlc291cmNlW10gbXVzdCBub3QgYmUgZW1wdHkgb3IgbnVsbCksIHRoZW4KLQkgKiB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgInJlc291cmNlcyIgYWZmZWN0ZWQgYnkgdGhlIHRlc3QgY2FzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU5hbWVzKFN0cmluZ1tdIHJlc291cmNlTmFtZXMpIHsKLQkJX3Jlc291cmNlTmFtZXMgPSByZXNvdXJjZU5hbWVzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlcyhNZXNzYWdlTWV0YURhdGFbXSBtZXNzYWdlcykgewotCQkvLyBJZiBtZXNzYWdlcyBhcmUgbnVsbCwgdGhhdCBtZWFucyB0aGF0IHRoZSB0ZXN0IGNhc2UgZXhwZWN0cyBubyB2YWxpZGF0aW9uIGVycm9ycy4KLQkJX21lc3NhZ2VzID0gKChtZXNzYWdlcyA9PSBudWxsKSA/IG5ldyBNZXNzYWdlTWV0YURhdGFbMF0gOiBtZXNzYWdlcyk7Ci0JfQotCQotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YSBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpIHsKLQkJcmV0dXJuIF92bWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmKF9uYW1lID09IG51bGwpIHsKLQkJCV9uYW1lID0gX3ZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpICsgIjo6IiArIGdldFByb2plY3QoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBfbmFtZTsKLQl9CQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXREaXIoKSB7Ci0JCS8vIElmIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHRlc3RjYXNlIGlucHV0IGlzbid0IHNwZWNpZmllZCwgCi0JCS8vIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCBpcyBpbiBhIHN1YmRpcmVjdG9yeSwgbmFtZWQgInRlc3RJbnB1dCIsCi0JCS8vIG9mIHRoZSB0ZXN0Y2FzZSdzIHBsdWdpbi4KLQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldFBsdWdpbkRlc2NyaXB0b3IoZ2V0RGVjbGFyaW5nUGx1Z2luSWQoKSk7Ci0JCWlmKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJLy8gQmVjYXVzZSBQbGF0Zm9ybS5hc0xvY2FsVVJMIHRocm93cyBhbiBJT0V4Y2VwdGlvbiBpZiB0aGUgVVJMIHJlc29sdmVzCi0JCQkvLyB0byBhIGRpcmVjdG9yeSwgZmluZCB0aGUgcGx1Z2luLnhtbCBmaWxlIGFuZCB0aGVuIHN0cmlwIG9mZiB0aGUgZmlsZSBuYW1lIAotCQkJLy8gdG8gZmluZCB0aGUgdGVzdElucHV0IGRpcmVjdG9yeS4KLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHBsdWdpblhtbFBhdGggPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKG5ldyBVUkwoZGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCksICJwbHVnaW4ueG1sIikpLmdldFBhdGgoKTsgLy8kTk9OLU5MUy0xJAotCQkJCUZpbGUgcGx1Z2luWG1sID0gbmV3IEZpbGUocGx1Z2luWG1sUGF0aCk7Ci0JCQkJaWYocGx1Z2luWG1sLmV4aXN0cygpKSB7Ci0JCQkJCUZpbGUgaW5wdXREaXIgPSBuZXcgRmlsZShwbHVnaW5YbWwuZ2V0UGFyZW50KCksICJ0ZXN0SW5wdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaW5wdXREaXIuZXhpc3RzKCkgJiYgaW5wdXREaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJcmV0dXJuIGlucHV0RGlyLmdldFBhdGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZXhjKSB7Ci0JCQkgICAgTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmdldExldmVsKCkgPT0gTGV2ZWwuU0VWRVJFKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGJ1dCBpZiB3ZSBkbywgYXNzdW1lIHRoYXQgdGhlIGlucHV0IAotCQkvLyBkaXJlY3RvcnkgaXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCi0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0Y2FzZVV0aWxpdHkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1Rlc3RjYXNlVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmQ1OGUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1Rlc3RjYXNlVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0aGF0IGNvbnRhaW5zIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXN0Y2FzZVV0aWxpdHkgewotCS8qKgotCSAqIExvYWQgdGhlIHByb2plY3QgdGhhdCB0aGlzIHRlc3QgY2FzZSBpcyBzdXBwb3NlZCB0byBydW4gb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBmaW5kUHJvamVjdChJVGVzdGNhc2VNZXRhRGF0YSB0bWQpIHsKLQkJaWYodG1kID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHRtZC5nZXRQcm9qZWN0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgaW5wdXQgZm9yIHRoaXMgdGVzdCBjYXNlIGNhbiBiZSBsb2NhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElucHV0RGlyKElUZXN0Y2FzZU1ldGFEYXRhIHRtZCkgewotCQkvLyBJZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSB0ZXN0Y2FzZSBpbnB1dCBpc24ndCBzcGVjaWZpZWQsIAotCQkvLyBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgaXMgaW4gYSBzdWJkaXJlY3RvcnksIG5hbWVkICJ0ZXN0SW5wdXQiLAotCQkvLyBvZiB0aGUgdGVzdGNhc2UncyBwbHVnaW4uCi0JCUlQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JCUlQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXRQbHVnaW5EZXNjcmlwdG9yKHRtZC5nZXREZWNsYXJpbmdQbHVnaW5JZCgpKTsKLQkJaWYoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkvLyBCZWNhdXNlIFBsYXRmb3JtLmFzTG9jYWxVUkwgdGhyb3dzIGFuIElPRXhjZXB0aW9uIGlmIHRoZSBVUkwgcmVzb2x2ZXMKLQkJCS8vIHRvIGEgZGlyZWN0b3J5LCBmaW5kIHRoZSBwbHVnaW4ueG1sIGZpbGUgYW5kIHRoZW4gc3RyaXAgb2ZmIHRoZSBmaWxlIG5hbWUgCi0JCQkvLyB0byBmaW5kIHRoZSB0ZXN0SW5wdXQgZGlyZWN0b3J5LgotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgcGx1Z2luWG1sUGF0aCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChkZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKSwgInBsdWdpbi54bWwiKSkuZ2V0UGF0aCgpOyAvLyROT04tTkxTLTEkCi0JCQkJRmlsZSBwbHVnaW5YbWwgPSBuZXcgRmlsZShwbHVnaW5YbWxQYXRoKTsKLQkJCQlpZihwbHVnaW5YbWwuZXhpc3RzKCkpIHsKLQkJCQkJRmlsZSBpbnB1dERpciA9IG5ldyBGaWxlKHBsdWdpblhtbC5nZXRQYXJlbnQoKSwgInRlc3RJbnB1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpbnB1dERpci5leGlzdHMoKSAmJiBpbnB1dERpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQlyZXR1cm4gaW5wdXREaXIuZ2V0UGF0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gU2hvdWxkIG5ldmVyIGdldCBoZXJlLCBidXQgaWYgd2UgZG8sIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCAKLQkJLy8gZGlyZWN0b3J5IGlzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGxvZ0ZpbGVOYW1lIG11c3QgcG9pbnQgdG8gYSBmdWxseS1xdWFsaWZpZWQgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmx1c2goU3RyaW5nIGxvZ0ZpbGVOYW1lLCBTdHJpbmcgYnVmZmVyLCBib29sZWFuIGFwcGVuZCkgewotCQl0cnkgewotCQkJRmlsZVdyaXRlciB3cml0ZXIgPSBuZXcgRmlsZVdyaXRlcihsb2dGaWxlTmFtZSwgYXBwZW5kKTsKLQkJCXdyaXRlci53cml0ZShidWZmZXIpOyAvLyBXcml0ZSB0aGUgZW50aXJlIHJlcG9ydCB0byB0aGUgc3RhdGUgbG9nLgotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2goSU9FeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1ZhbGlkYXRvclRlc3RjYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9WYWxpZGF0b3JUZXN0Y2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTMwZDUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1ZhbGlkYXRvclRlc3RjYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuVmFsaWRhdGlvblR5cGVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbC5CVlRSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVGFza0xpc3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZUaHJlYWRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvclN1YnNldE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRvclRlc3RjYXNlIGltcGxlbWVudHMgSVRlc3RjYXNlTWV0YURhdGEgewotCXByaXZhdGUgU3RyaW5nIF9wbHVnaW5JZCA9IG51bGw7IC8vIFRoZSBwbHVnaW4gaWQgdGhhdCBoYXMgY29udHJpYnV0ZWQgdGhpcyB0ZXN0IGNhc2UuCi0JcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YSBfdm1kID0gbnVsbDsKLQlwcml2YXRlIE1lc3NhZ2VNZXRhRGF0YVtdIF9tZXNzYWdlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3Byb2plY3ROYW1lID0gbnVsbDsgLy8gdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGlzIHRlc3QgY2FzZSB0ZXN0cwotCXByaXZhdGUgU3RyaW5nW10gX3Jlc291cmNlTmFtZXMgPSBudWxsOyAvLyB0aGUgcmVzb3VyY2VzIGxpc3RlZCBpbiB0aGUgTWVzc2FnZU1ldGFEYXRhIG9mIHRoaXMgdGVzdCBjYXNlLgotCXByaXZhdGUgU3RyaW5nIF9pbnB1dEZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfbmFtZSA9IG51bGw7IC8vIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLQlwcml2YXRlIGJvb2xlYW4gX3Zpc2libGUgPSB0cnVlOyAvLyBJcyB0aGlzIHRlc3QgY2FzZSB2aXNpYmxlIG9uIHRoZSBUZXN0IENvbGxlY3RvciBtZW51Ci0JCi0JcHVibGljIFZhbGlkYXRvclRlc3RjYXNlKFN0cmluZyBwbHVnaW5OYW1lLCBTdHJpbmcgcHJvamVjdCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBTdHJpbmcgaW5wdXRGaWxlTmFtZSwgYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCV9wbHVnaW5JZCA9IHBsdWdpbk5hbWU7Ci0JCV9wcm9qZWN0TmFtZSA9IHByb2plY3Q7Ci0JCV92bWQgPSB2bWQ7Ci0JCV9pbnB1dEZpbGVOYW1lID0gaW5wdXRGaWxlTmFtZTsKLQkJX3Zpc2libGUgPSB2aXNpYmxlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0JCXJldHVybiBfdmlzaWJsZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIF9wbHVnaW5JZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0TmFtZTsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBUZXN0Y2FzZVV0aWxpdHkuZmluZFByb2plY3QodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9pbnB1dEZpbGVOYW1lOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBtZXNzYWdlcwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtTWVzc2FnZXMoKSB7Ci0JCXJldHVybiBnZXRNZXNzYWdlcyhWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pLnNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIG1lc3NhZ2VzIHRoYXQgc2hvdWxkIGJlIHJlcG9ydGVkIGZvciB0aGUgZ2l2ZW4gYnVpbGQKLQkgKiB0eXBlLiAoZS5nLiBpZiB0aGUgdmFsaWRhdG9yIGRvZXMgbm90IHN1cHBvcnQgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiwKLQkgKiB0aGVuIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBsaXN0IG9mIGV4cGVjdGVkIG1lc3NhZ2VzLCByZXR1cm4gYW4gZW1wdHkgCi0JICogbGlzdC4pCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoaW50IGJ1aWxkVHlwZSkgewotCQkvLyBUaGUgbWVzc2FnZXMgbmVlZCB0byBiZSBzdG9yZWQgaW4gYSBsaXN0IGluc3RlYWQgb2YgYW4gYXJyYXkgYmVjYXVzZQotCQkvLyB0aGUgbGlzdCBpcyBzb3J0ZWQgYmVmb3JlIHNlYXJjaGluZyAmIGRpc3BsYXlpbmcuCi0JCXN3aXRjaChidWlsZFR5cGUpIHsKLQkJCWNhc2UoVmFsaWRhdGlvblR5cGVFbnVtLkFVVE9fVkFMSURBVElPTik6Ci0JCQljYXNlKFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OKTogewotCQkJCWlmKCFnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmlzSW5jcmVtZW50YWwoKSkgewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCQl9Ci0JCQkJLy8gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGRlZmF1bHQgY29weSBiZWxvdy4KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY2FzZShWYWxpZGF0aW9uVHlwZUVudW0uRlVMTF9WQUxJREFUSU9OKTogewotCQkJCWlmKCFnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmlzRnVsbEJ1aWxkKCkpIHsKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQkJfQotCQkJCS8vIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBkZWZhdWx0IGNvcHkgYmVsb3cuCi0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNhc2UoVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKToKLQkJCWRlZmF1bHQ6IHsKLQkJCQkvLyBSZXR1cm4gdGhlIGRlZmF1bHQgY29weSBiZWxvdy4KLQkJCX0KLQkJCQotCQl9Ci0JCQotCQlMaXN0IGNvcHkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaT0wOyBpPF9tZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJY29weS5hZGQoX21lc3NhZ2VzW2ldKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCQotCS8vIFJldHVybiB0aGUgcmVzb3VyY2VzIGluIHRoaXMgcHJvamVjdCBmb3Igd2hpY2ggdGhlcmUgaXMgYSBtZXNzYWdlIGluIHRoaXMgdGVzdCBjYXNlLgotCS8vIE5vIHJlc291cmNlIGluc3RhbmNlIHdpbGwgYmUgaW4gdGhlIHJlc291cmNlIG1vcmUgdGhhbiBvbmNlLgotCXB1YmxpYyBJUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlTZXQgdGVtcCA9IG5ldyBIYXNoU2V0KCk7IC8vIHVzZSBhIHNldCBpbiBjYXNlIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgbWVzc2FnZSByZWdpc3RlcmVkIGFnYWluc3QgYSByZXNvdXJjZSAoZG9uJ3Qgd2FudCBkdXBsaWNhdGVzIGluIHRoZSBsaXN0KS4KLQkJU3RyaW5nW10gcmVzb3VyY2VOYW1lcyA9IGdldFJlc291cmNlTmFtZXMoKTsKLQkJZm9yKGludCBpPTA7IGk8cmVzb3VyY2VOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZXNbaV07Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9qZWN0LmZpbmRNZW1iZXIocmVzb3VyY2VOYW1lKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkvLyByZXNvdXJjZSBleGlzdHMKLQkJCQl0ZW1wLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlSZXNvdXJjZVtdIHJlc3VsdCA9IG5ldyBJUmVzb3VyY2VbdGVtcC5zaXplKCldOwotCQl0ZW1wLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlTmFtZXMoKSB7Ci0JCWlmKF9yZXNvdXJjZU5hbWVzID09IG51bGwpIHsKLQkJCV9yZXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1tfbWVzc2FnZXMubGVuZ3RoXTsKLQkJCWZvcihpbnQgaT0wOyBpPF9tZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCV9yZXNvdXJjZU5hbWVzW2ldID0gX21lc3NhZ2VzW2ldLmdldFJlc291cmNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9yZXNvdXJjZU5hbWVzOwotCX0KLQkKLQkvKioKLQkgKiBXaGVuIGFuIGVtcHR5IFRNRCBpcyB1c2VkIHRvIHRlc3QgYW4gb3BlcmF0aW9uLCBhbmQgdGhlIG9wZXJhdGlvbiBuZWVkcyB0aGUgSVJlc291cmNlW10KLQkgKiBhZmZlY3RlZCBieSB0aGUgVE1EIHRvIGtub3cgd2hldGhlciBvciBub3QgdGhlIG9wZXJhdGlvbiBwYXNzZXMgKGkuZS4sIG9uZSBvZiB0aGUgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uCi0JICogY29uc3RydWN0b3JzIHRha2VzIGFuIElSZXNvdXJjZVtdLCBhbmQgdGhlIElSZXNvdXJjZVtdIG11c3Qgbm90IGJlIGVtcHR5IG9yIG51bGwpLCB0aGVuCi0JICogdGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlICJyZXNvdXJjZXMiIGFmZmVjdGVkIGJ5IHRoZSB0ZXN0IGNhc2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VOYW1lcyhTdHJpbmdbXSByZXNvdXJjZU5hbWVzKSB7Ci0JCV9yZXNvdXJjZU5hbWVzID0gcmVzb3VyY2VOYW1lczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZXMoTWVzc2FnZU1ldGFEYXRhW10gbWVzc2FnZXMpIHsKLQkJLy8gSWYgbWVzc2FnZXMgYXJlIG51bGwsIHRoYXQgbWVhbnMgdGhhdCB0aGUgdGVzdCBjYXNlIGV4cGVjdHMgbm8gdmFsaWRhdGlvbiBlcnJvcnMuCi0JCV9tZXNzYWdlcyA9ICgobWVzc2FnZXMgPT0gbnVsbCkgPyBuZXcgTWVzc2FnZU1ldGFEYXRhWzBdIDogbWVzc2FnZXMpOwotCX0KLQkKLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yTWV0YURhdGEoKSB7Ci0JCXJldHVybiBfdm1kOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzKCkgewotCQlyZXR1cm4gZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZihfbmFtZSA9PSBudWxsKSB7Ci0JCQlfbmFtZSA9IF92bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSArICI6OiIgKyBnZXRQcm9qZWN0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIF9uYW1lOwotCX0JCi0JCi0JcHVibGljIHZvaWQgcnVuKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyBzdGF0dXMgPSAiPj4+Pj5SVU4gVkFMSURBVElPTiBURVNUIFBBU1MgWyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICJdPj4+Pj4iOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soc3RhdHVzKTsKLQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCBWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT05fTkFNRSwgdmFsaWRhdGUoYnVmZmVyLCBwcm9qZWN0LCBWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04sIFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTl9OQU1FKSk7Ci0JCXN0YXR1cyA9ICI+Pj4+PkVORCBSVU4gVkFMSURBVElPTiBURVNUIFBBU1MgWyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICJdPj4+Pj4iOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soc3RhdHVzKTsKLQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCQotCQlzdGF0dXMgPSAiPj4+Pj5GVUxMIEJVSUxEIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CQkJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soc3RhdHVzKTsKLQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCBWYWxpZGF0aW9uVHlwZUVudW0uRlVMTF9WQUxJREFUSU9OX05BTUUsIHZhbGlkYXRlKGJ1ZmZlciwgcHJvamVjdCwgVmFsaWRhdGlvblR5cGVFbnVtLkZVTExfVkFMSURBVElPTiwgVmFsaWRhdGlvblR5cGVFbnVtLkZVTExfVkFMSURBVElPTl9OQU1FKSk7Ci0JCXN0YXR1cyA9ICI+Pj4+PkVORCBGVUxMIEJVSUxEIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQlidWZmZXIud3JpdGUoc3RhdHVzKTsKLQkJCi0JCXN0YXR1cyA9ICI+Pj4+PklOQ1JFTUVOVEFMIEJVSUxEIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQlidWZmZXIud3JpdGUoc3RhdHVzKTsKLQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksIFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OX05BTUUsIHZhbGlkYXRlKGJ1ZmZlciwgcHJvamVjdCwgVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT04sIFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OX05BTUUpKTsKLQkJc3RhdHVzID0gIj4+Pj4+RU5EIElOQ1JFTUVOVEFMIEJVSUxEIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQlidWZmZXIud3JpdGUoc3RhdHVzKTsKLQkJCi0JCXN0YXR1cyA9ICI+Pj4+PkFVVE8gQlVJTEQgVEVTVCBQQVNTIFsiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiXT4+Pj4+IjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKHN0YXR1cyk7Ci0JCWJ1ZmZlci53cml0ZShzdGF0dXMpOwotCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgVmFsaWRhdGlvblR5cGVFbnVtLkFVVE9fVkFMSURBVElPTl9OQU1FLCB2YWxpZGF0ZShidWZmZXIsIHByb2plY3QsIFZhbGlkYXRpb25UeXBlRW51bS5BVVRPX1ZBTElEQVRJT04sIFZhbGlkYXRpb25UeXBlRW51bS5BVVRPX1ZBTElEQVRJT05fTkFNRSkpOwotCQlzdGF0dXMgPSAiPj4+Pj5FTkQgQVVUTyBCVUlMRCBURVNUIFBBU1MgWyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICJdPj4+Pj4iOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soc3RhdHVzKTsKLQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCQotCQlpZihnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmlzQXN5bmMoKSkgewotCQkJc3RhdHVzID0gIj4+Pj4+QVNZTkNIUk9OT1VTIFZBTElEQVRJT04gVEVTVCBQQVNTIFsiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiXT4+Pj4+IjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgVmFsaWRhdGlvblR5cGVFbnVtLkFTWU5DX05BTUUsIGFzeW5jVmFsaWRhdGUoYnVmZmVyLCBwcm9qZWN0LCBWYWxpZGF0aW9uVHlwZUVudW0uQVNZTkNfTkFNRSkpOwotCQkJc3RhdHVzID0gIj4+Pj4+RU5EIEFTWU5DSFJPTk9VUyBWQUxJREFUSU9OIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soc3RhdHVzKTsKLQkJCWJ1ZmZlci53cml0ZShzdGF0dXMpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gQnkgZGVmYXVsdCwgInBhc3MiIHRoZSBhc3luY2hyb3VzIHRlc3RzIG9mIGFueSB2YWxpZGF0b3IgdGhhdCBjYW5ub3QgcnVuIGFzeW5jaHJvbm91cyB0ZXN0cy4KLQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCBWYWxpZGF0aW9uVHlwZUVudW0uQVNZTkNfTkFNRSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBpbnQgdmFsaWRhdGlvblR5cGVFbnVtLCBTdHJpbmcgdGFza05hbWUpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlib29sZWFuIHBhc3NlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlwYXNzZWQgPSBCVlRSdW5uZXIuc2luZ2xldG9uKCkudGVzdChidWZmZXIsIHByb2plY3QsIHRoaXMsIHZhbGlkYXRpb25UeXBlRW51bSk7Ci0JCX0KLQkJY2F0Y2goQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWJ1ZmZlci5hZGRFbGFwc2VkVGltZSh0YXNrTmFtZSwgKGVuZCAtIHN0YXJ0KSk7Ci0JCQlidWZmZXIud3JpdGUoIlRvdGFsIHRpbWUgZm9yIHZhbGlkYXRvciAiICsgZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpICsgIiBvZiBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgaW4gIiArIHRhc2tOYW1lICsgIiBtb2RlIHdhcyAiICsgKGVuZCAtIHN0YXJ0KSArICIgbWlsbGlzZWNvbmRzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJfQotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXN5bmNWYWxpZGF0ZShJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHN1YlRhc2tOYW1lKSB7Ci0JCWJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlsb25nIGVuZCA9IDA7Ci0JCXRyeSB7Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIGdjb25mID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJCS8vYm9vbGVhbiBkaXNhYmxlVmFsaWRhdGlvbiA9IGdjb25mLm51bWJlck9mRW5hYmxlZFZhbGlkYXRvcnMoKT09MDsKLQkJCS8vYm9vbGVhbiBhdXRvVmFsaWRhdGUgPSBnY29uZi5pc0F1dG9WYWxpZGF0ZSgpOwotCQkJLy9ib29sZWFuIGJ1aWxkVmFsaWRhdGUgPSBnY29uZi5pc0J1aWxkVmFsaWRhdGUoKTsKLQkJCXRyeSB7Ci0JCQkJLy9nY29uZi5zZXRBdXRvVmFsaWRhdGUoZmFsc2UpOwotCQkJCS8vIFR1cm4gb2ZmIGF1dG8tdmFsaWRhdGUgc28gdGhhdCB0aGUgcHJvamVjdCBpc24ndCB2YWxpZGF0ZWQgYXV0b21hdGljYWxseS4KLQkJCQkvL2djb25mLnNldEF1dG9WYWxpZGF0ZShmYWxzZSk7Ci0JCQkJLy9nY29uZi5zZXRCdWlsZFZhbGlkYXRlKGZhbHNlKTsKLQkJCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCQkKLQkJCQkvLyBUd28gdGVzdHM6IAotCQkJCS8vICAgMS4gUnVuIHZhbGlkYXRpb24gb24gY29waWVzIG9mIHRoZSBvcmlnaW5hbCBwcm9qZWN0OiAicHJvamVjdE5hbWUuZm9yayIgYW5kICJwcm9qZWN0TmFtZS5ub0ZvcmsiCi0JCQkJLy8gICAgICBDb21wYXJlIHRoZSBtYXJrZXJzIG9mIHRoZSBjb3BpZXMgdG8gdGhlIEZWVCBUZXN0Y2FzZU1ldGFEYXRhLCBhbmQgdGhlIHZhbGlkYXRvciBwYXNzZXMgaWYgdGhlIAotCQkJCS8vCQlyZXN1bHRzIG9mIGVhY2ggY29weSBtYXRjaGVzIHRoZSBUZXN0Y2FzZU1ldGFEYXRhLgotCQkJCS8vICAgMi4gUnVuIHZhbGlkYXRpb24gb24gY29waWVzLCBidXQgdGhpcyB0aW1lIGludHJvZHVjZSBjaGFuZ2VzIGR1cmluZyB0aGUgdmFsaWRhdGlvbi4KLQkJCQkvLwkJRXh0cmFjdCB0aGUgbmFtZXMgb2YgcmVzb3VyY2VzIGZyb20gdGhlIHRlc3RjYXNlIG1ldGFkYXRhLCBmaW5kIHRob3NlIHJlc291cmNlcywgYW5kCi0JCQkJLy8JCWFkZC9kZWxldGUvcmVuYW1lL21vdmUvY2xvc2UvY2hhbmdlIHRoZW0uCi0JCQkJCi0JCQkJYm9vbGVhbiBwYXNzMSA9IHZhbGlkYXRlQW5kQ29tcGFyZShidWZmZXIsIHByb2plY3QsIHN1YlRhc2tOYW1lKTsKLQkJCQlib29sZWFuIHBhc3MyID0gdmFsaWRhdGVDaGFuZ2VBbmRDb21wYXJlKGJ1ZmZlciwgcHJvamVjdCwgSUZpbGVEZWx0YS5DSEFOR0VELCBzdWJUYXNrTmFtZSk7Ci0JCQkJYm9vbGVhbiBwYXNzMyA9IHZhbGlkYXRlQ2hhbmdlQW5kQ29tcGFyZShidWZmZXIsIHByb2plY3QsIElGaWxlRGVsdGEuREVMRVRFRCwgc3ViVGFza05hbWUpOwotCQkJCXBhc3NlZCA9IChwYXNzMSAmJiBwYXNzMiAmJiBwYXNzMyk7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIENvdWxkbid0IGNyZWF0ZSBjb3B5Lkp1c3QgY29udGludWUgd2l0aCB0aGUgbmV4dCB0ZXN0LgotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vZ2NvbmYuc2V0QXV0b1ZhbGlkYXRlKGF1dG9WYWxpZGF0ZSk7Ci0JCQkJLy9nY29uZi5zZXRCdWlsZFZhbGlkYXRlKGJ1aWxkVmFsaWRhdGUpOwotCQkJCWdjb25mLnBhc3NpdmF0ZSgpOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJYnVmZmVyLmFkZEVsYXBzZWRUaW1lKFZhbGlkYXRpb25UeXBlRW51bS5BU1lOQ19OQU1FLCAoZW5kIC0gc3RhcnQpKTsKLQkJCWJ1ZmZlci53cml0ZSgiVG90YWwgdGltZSBmb3IgdmFsaWRhdG9yICIgKyBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkgKyAiIG9mIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiBpbiBhc3luY2hyb25vdXMgbW9kZSB3YXMgIiArIChlbmQgLSBzdGFydCkgKyAiIG1pbGxpc2Vjb25kcy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCi0JCX0KLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gdmFsaWRhdGlvbiwgdXNpbmcgc2V2ZXJhbCBvcGVyYXRpb25zIChib3RoIGZvcmtlZCBhbmQgbm90IGZvcmtlZCksIG9uIHRoZSBJUHJvamVjdC4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0LCBhZnRlciB0aGUgbGFzdCBvcGVyYXRpb24gaXMgY29tcGxldGUsIGlzIHRoZSBleHBlY3RlZCByZXN1bHQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlQW5kQ29tcGFyZShJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHN1YlRhc2tOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIE5vdyBjb21wYXJlIHRoZSBJUHJvamVjdCdzIHJlc3VsdCB0byB0aGUgZXhwZWN0ZWQgVGVzdGNhc2VNZXRhRGF0YSByZXN1bHQuCi0JCS8vIFZhbGlkYXRlCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBub0ZvcmtPcCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgZmFsc2UpOwotCQlub0ZvcmtPcC5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCW5vRm9ya09wLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIGZvcmtPcCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZvcmtPcC5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCWZvcmtPcC5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBub0ZvcmtPcDIgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIGZhbHNlKTsKLQkJbm9Gb3JrT3AyLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJbm9Gb3JrT3AyLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBmb3JrT3AyID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB0cnVlLCB0cnVlKTsKLQkJZm9ya09wMi5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCWZvcmtPcDIucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wMyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZvcmtPcDMuc2V0VmFsaWRhdG9ycyhnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvck5hbWVzKCkpOwotCQlmb3JrT3AzLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJLy8gV2FpdCB1bnRpbCBhbGwgb2YgdGhlIHRocmVhZHMgaGF2ZSBjb21wbGV0ZS4KLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIldhaXRpbmcgZm9yIGFsbCBmb3JrZWQgdGhyZWFkcyB0byBmaW5pc2guLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSghVlRocmVhZE1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzRG9uZSgpICYmICFidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7fQotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiQWxsIHRocmVhZHMgYXJlIGNvbXBsZXRlLiBCZWdpbm5pbmcgdGhlIGNvbXBhcmlzb24uIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIENvbXBhcmUKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0KLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIEJWVFJ1bm5lci5zaW5nbGV0b24oKS52ZXJpZnkoYnVmZmVyLCBnZXROYW1lKCksIHN1YlRhc2tOYW1lLCBwcm9qZWN0LCBnZXRNZXNzYWdlcyhWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pLCBtYXJrZXJzKTsgCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlQ2hhbmdlQW5kQ29tcGFyZShJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCwgaW50IGlmaWxlRGVsdGFUeXBlLCBTdHJpbmcgc3ViVGFza05hbWUpIHRocm93cyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBwYXNzZWQgPSB0cnVlOwotCQkKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW117Z2V0VmFsaWRhdG9yTWV0YURhdGEoKX07Ci0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gbm9Gb3JrT3BPcmlnID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB0cnVlLCBmYWxzZSk7Ci0JCW5vRm9ya09wT3JpZy5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCW5vRm9ya09wT3JpZy5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gbm9Gb3JrT3BDaGFuZ2VkID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB2bWRzLCBnZXRSZXNvdXJjZXMocHJvamVjdCksIGlmaWxlRGVsdGFUeXBlLCBmYWxzZSwgZmFsc2UpOyAvLyBmYWxzZSA9IGRvIG5vdCBmb3JjZSBpZiB0aGVyZSdzIG5vIGRlbHRhcyB0byB2YWxpZGF0ZQotCQlub0ZvcmtPcENoYW5nZWQucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIGZvcmtPcE9yaWcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIHRydWUpOwotCQlmb3JrT3BPcmlnLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJZm9ya09wT3JpZy5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wQ2hhbmdlZCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdm1kcywgIGdldFJlc291cmNlcyhwcm9qZWN0KSwgaWZpbGVEZWx0YVR5cGUsIGZhbHNlLCB0cnVlKTsgLy8gZmFsc2UgPSBkbyBub3QgZm9yY2UgaWYgdGhlcmUncyBubyBkZWx0YXMgdG8gdmFsaWRhdGUKLQkJZm9ya09wQ2hhbmdlZC5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBub0ZvcmtPcDJPcmlnID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB0cnVlLCBmYWxzZSk7Ci0JCW5vRm9ya09wMk9yaWcuc2V0VmFsaWRhdG9ycyhnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvck5hbWVzKCkpOwotCQlub0ZvcmtPcDJPcmlnLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBub0ZvcmtPcDJDaGFuZ2VkID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB2bWRzLCAgZ2V0UmVzb3VyY2VzKHByb2plY3QpLCBpZmlsZURlbHRhVHlwZSwgZmFsc2UsIGZhbHNlKTsgLy8gZmFsc2UgPSBkbyBub3QgZm9yY2UgaWYgdGhlcmUncyBubyBkZWx0YXMgdG8gdmFsaWRhdGUKLQkJbm9Gb3JrT3AyQ2hhbmdlZC5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wMk9yaWcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIHRydWUpOwotCQlmb3JrT3AyT3JpZy5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCWZvcmtPcDJPcmlnLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIGZvcmtPcDJDaGFuZ2VkID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB2bWRzLCAgZ2V0UmVzb3VyY2VzKHByb2plY3QpLCBpZmlsZURlbHRhVHlwZSwgZmFsc2UsIHRydWUpOyAvLyBmYWxzZSA9IGRvIG5vdCBmb3JjZSBpZiB0aGVyZSdzIG5vIGRlbHRhcyB0byB2YWxpZGF0ZQotCQlmb3JrT3AyQ2hhbmdlZC5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wM09yaWcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIHRydWUpOwotCQlmb3JrT3AzT3JpZy5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCWZvcmtPcDNPcmlnLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIGZvcmtPcDNDaGFuZ2VkID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB2bWRzLCBnZXRSZXNvdXJjZXMocHJvamVjdCksIGlmaWxlRGVsdGFUeXBlLCBmYWxzZSwgdHJ1ZSk7IC8vIGZhbHNlID0gZG8gbm90IGZvcmNlIGlmIHRoZXJlJ3Mgbm8gZGVsdGFzIHRvIHZhbGlkYXRlCi0JCWZvcmtPcDNDaGFuZ2VkLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJLy8gV2FpdCB1bnRpbCBhbGwgb2YgdGhlIHRocmVhZHMgaGF2ZSBjb21wbGV0ZS4KLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIldhaXRpbmcgZm9yIGFsbCBmb3JrZWQgdGhyZWFkcyB0byBmaW5pc2guLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSghVlRocmVhZE1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzRG9uZSgpICYmICFidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7fQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiQ29tcGFyaXNvbiBjYW5jZWxsZWQuIFBlcmZvcm1pbmcgY2xlYW51cC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJBbGwgdGhyZWFkcyBhcmUgY29tcGxldGUuIEJlZ2lubmluZyB0aGUgY29tcGFyaXNvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gQ29tcGFyZQotCQlJTWFya2VyW10gbWFya2VycyA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQotCQkvLyBOb3cgY29tcGFyZSB0aGUgSVByb2plY3QncyByZXN1bHQgdG8gdGhlIGV4cGVjdGVkIFRlc3RjYXNlTWV0YURhdGEgcmVzdWx0LgotCQkvLyBEb24ndCB3cml0ZSBfcGFzc2VkID0gX3Bhc3NlZCAmJiBnZXQuLi4KLQkJLy8gV2hlbiB0aGUgX3Bhc3NlZCA9PSBmYWxzZSwgdGhlbiBqYXZhIGRpZG4ndCBib3RoZXIgcnVubmluZyB0aGUgdGVzdC4KLQkJcGFzc2VkID0gQlZUUnVubmVyLnNpbmdsZXRvbigpLnZlcmlmeShidWZmZXIsIGdldE5hbWUoKSwgc3ViVGFza05hbWUsIHByb2plY3QsIGdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTiksIG1hcmtlcnMpOwotCQkKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmRlbGV0ZU1hcmtlcnMobWFya2Vycyk7Ci0JCi0JCXJldHVybiBwYXNzZWQ7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQlZUUnVubmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC91dGlsL0JWVFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWEwNTgwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQlZUUnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuVmFsaWRhdGlvblR5cGVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuSVRlc3RjYXNlTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5NZXNzYWdlTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5NZXNzYWdlVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5Lk9wZXJhdGlvblRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVGVzdFNldHVwSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVGVzdGNhc2VVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRhc2tMaXN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WVGhyZWFkTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLk9uZVZhbGlkYXRvck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQlZUUnVubmVyIHsKLQlwcml2YXRlIHN0YXRpYyBCVlRSdW5uZXIgX2luc3QgPSBudWxsOwotCXByaXZhdGUgTGlzdCBfZXh0cmEgPSBudWxsOyAvLyBUaGUgZXh0cmEgbWFya2VycyByZXBvcnRlZCAoc3RvcmVkIGluIGEgbGlzdCB0byBtYWtlIHJlYWRpbmcgZWFzaWVyKS4KLQlwcml2YXRlIExpc3QgX21pc3NpbmcgPSBudWxsOyAvLyBUaGUgbWlzc2luZyBNTUQgdGhhdCB3ZXJlIHN1cHBvc2VkIHRvIGJlIHJlcG9ydGVkIChzdG9yZWQgaW4gYSBsaXN0IHRvIG1ha2UgcmVhZGluZyBlYXNpZXIpLgotCi0JcHVibGljIHN0YXRpYyBCVlRSdW5uZXIgc2luZ2xldG9uKCkgewotCQlpZihfaW5zdCA9PSBudWxsKSB7Ci0JCQlfaW5zdCA9IG5ldyBCVlRSdW5uZXIoKTsKLQkJfQotCQlyZXR1cm4gX2luc3Q7Ci0JfQotCQotCXByaXZhdGUgQlZUUnVubmVyKCkgewotCQlzdXBlcigpOwotCQlfZXh0cmEgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCV9taXNzaW5nID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNWZXJib3NlKCkgewotCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGNoYXIgZ2V0U2V2ZXJpdHlDaGFyKEludGVnZXIgc2V2ZXJpdHkpIHsKLQkJaWYoc2V2ZXJpdHkgPT0gbnVsbCkgewotCQkJcmV0dXJuICc/JzsKLQkJfQotCQkKLQkJc3dpdGNoKHNldmVyaXR5LmludFZhbHVlKCkpIHsKLQkJCWNhc2UoSU1hcmtlci5TRVZFUklUWV9FUlJPUik6IHsKLQkJCQlyZXR1cm4gJ0UnOwotCQkJfQotCQkJCi0JCQljYXNlKElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyk6IHsKLQkJCQlyZXR1cm4gJ1cnOwotCQkJfQotCQkJCi0JCQljYXNlKElNYXJrZXIuU0VWRVJJVFlfSU5GTyk6IHsKLQkJCQlyZXR1cm4gJ0knOwotCQkJfQotCQkJCi0JCQlkZWZhdWx0OiB7Ci0JCQkJcmV0dXJuICc/JzsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZ1tdIGdldE5hbWVzKElQcm9qZWN0W10gcHJvamVjdHMpIHsKLQkJaWYocHJvamVjdHMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCX0KLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW3Byb2plY3RzLmxlbmd0aF07Ci0JCWZvcihpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQluYW1lc1tpXSA9IHByb2plY3QuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVidWcoSUJ1ZmZlciBidWZmZXIsIElNYXJrZXJbXSBtZXNzYWdlcykgewotCQlpZihtZXNzYWdlcyA9PSBudWxsKSB7Ci0JCQlidWZmZXIud3JpdGUoIk5vdGhpbmcgdG8gZGVidWcgYmVjYXVzZSBub3RoaW5nIHdhcyByZXBvcnRlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWZvcihpbnQgaT0wOyBpPG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IG1lc3NhZ2VzW2ldOwotCQkJYnVmZmVyLndyaXRlKE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1hcmtlcikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0RGVidWdNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZihpc1ZlcmJvc2UoKSkgewotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsgLy8gaWYgdmVyYm9zZSBpcyB0cnVlLCBzaG93IHByb2dyZXNzIG1lc3NhZ2VzIGZvciB0aGUgY3JlYXRpb24gJiB2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0LiBPdGhlcndpc2Ugc2hvdyBvbmx5IHRoZSBCVlQgc3RhdHVzLgotCQl9Ci0JfQotCQotCS8qKgotCSAqIFdoZW4gaW52b2tpbmcgdGhlIHRlc3QgZnJvbSB0aGUgVUksIHRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIGltcG9ydGVkLCBzbyBqdXN0IHRlc3QgaXQuCi0JICogVGhlIG5hbWUgb2YgdGhlIHRlc3QgaXMgZGVyaXZlZCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgcGFzc2VkLgotCSAqLwkKLQlwdWJsaWMgaW50IHRlc3QoSUJ1ZmZlciBidWZmZXIsIElQcm9qZWN0W10gcHJvamVjdHMpIHRocm93cyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIHsJCi0JCVN0cmluZ1tdIHRlc3ROYW1lcyA9IGdldE5hbWVzKHByb2plY3RzKTsKLQkJQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLQkJCi0JCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5iZWdpblRhc2soIlJ1bm5pbmcgQlZUIHRlc3RzIiwgcHJvamVjdHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgdG90YWxUZXN0cyA9IDA7Ci0JCWludCB0b3RhbFBhc3NlZCA9IDA7Ci0JCWZvcihpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiVGVzdGluZyBwcm9qZWN0ICIgKyAoaSsxKSArICIgb2YgIiArIHByb2plY3RzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0ZXN0cyA9IHJlYWRlci5nZXRWYWxpZGF0b3JUZXN0cyhidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIHRlc3ROYW1lc1tpXSk7Ci0JCQlpZigodGVzdHMgPT0gbnVsbCkgfHwgKHRlc3RzLmxlbmd0aCA9PSAwKSkgewotCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJUaGVyZSBhcmUgbm8gdGVzdHMgdG8gcnVuLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWludCBudW1UZXN0c1Bhc3NlZCA9IDA7Ci0JCQlmb3IoaW50IGo9MDsgajx0ZXN0cy5sZW5ndGg7IGorKykgewotCQkJCVZhbGlkYXRvclRlc3RjYXNlIHRtZCA9IHRlc3RzW2pdOwotCQkJCWlmKHRlc3QoYnVmZmVyLCBwcm9qZWN0LCB0bWQsIFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTikpIHsKLQkJCQkJbnVtVGVzdHNQYXNzZWQrKzsKLQkJCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIlRlc3QgIiArIChqKzEpICsgIiBvZiAiICsgdGVzdHMubGVuZ3RoICsgIiBwYXNzZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiVGVzdCAiICsgKGorMSkgKyAiIG9mICIgKyB0ZXN0cy5sZW5ndGggKyAiIGZhaWxlZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLndvcmtlZCgxKTsKLQkJCX0KLQkJCQotCQkJdG90YWxUZXN0cyArPSB0ZXN0cy5sZW5ndGg7Ci0JCQl0b3RhbFBhc3NlZCArPSBudW1UZXN0c1Bhc3NlZDsKLQkJCQotCQkJYnVmZmVyLndyaXRlKG51bVRlc3RzUGFzc2VkICsgIiBvZiAiICsgdGVzdHMubGVuZ3RoICsgIiB0ZXN0cyBwYXNzZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWJ1ZmZlci53cml0ZSgiXG4+Pj4+Pj4+Pj4+VEVTVCBSRVNVTFRTPj4+Pj4+Pj4+PiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci53cml0ZSh0b3RhbFBhc3NlZCArICIgb2YgIiArIHRvdGFsVGVzdHMgKyAiIHRlc3RzIHBhc3NlZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5kb25lKCk7Ci0JCQotCQlyZXR1cm4gdG90YWxQYXNzZWQ7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFZhbGlkYXRpb25PcGVyYXRpb24gb24gdGhlIElQcm9qZWN0LCBpbnZva2UgdGhlIG9wZXJhdGlvbiwgYW5kIHZlcmlmeSB0aGF0IHRoZQotCSAqIHJlc3VsdGluZyBJTWFya2VycyBtYXRjaCB0aGUgZXhwZWN0ZWQgbWVzc2FnZXMgaW4gdGhlIHRtZC4KLQkgKi8JCi0JcHVibGljIGJvb2xlYW4gdGVzdChJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kLCBpbnQgdmFsaWRhdGlvbkVudW1UeXBlKSB0aHJvd3MgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCh2YWxpZGF0aW9uRW51bVR5cGUpIHsKLQkJCWNhc2UoVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKTogewotCQkJCXJldHVybiB0ZXN0KGJ1ZmZlciwgdG1kLmdldE5hbWUoKSwgVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OX05BTUUsIHRtZC5nZXRNZXNzYWdlcyh2YWxpZGF0aW9uRW51bVR5cGUpLCBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKHByb2plY3QsIHRtZC5nZXRWYWxpZGF0b3JDbGFzcygpLCB0cnVlLCBmYWxzZSksIEludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yTmFtZXMobmV3IFZhbGlkYXRvck1ldGFEYXRhW117dG1kLmdldFZhbGlkYXRvck1ldGFEYXRhKCl9KSk7IC8vIHRydWU9Zm9yY2UsIGZhbHNlPW5vIGZvcgotCQkJfQotCQkJCi0JCQljYXNlKFZhbGlkYXRpb25UeXBlRW51bS5GVUxMX1ZBTElEQVRJT04pOiB7Ci0JCQkJcmV0dXJuIGJ1aWxkKGJ1ZmZlciwgcHJvamVjdCwgdG1kLCB2YWxpZGF0aW9uRW51bVR5cGUsIFZhbGlkYXRpb25UeXBlRW51bS5GVUxMX1ZBTElEQVRJT05fTkFNRSk7Ci0JCQl9Ci0JCQkKLQkJCWNhc2UoVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT04pOiB7Ci0JCQkJcmV0dXJuIGJ1aWxkKGJ1ZmZlciwgcHJvamVjdCwgdG1kLCB2YWxpZGF0aW9uRW51bVR5cGUsIFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OX05BTUUpOwotCQkJfQotCQkJCi0JCQljYXNlKFZhbGlkYXRpb25UeXBlRW51bS5BVVRPX1ZBTElEQVRJT04pOiB7Ci0JCQkJcmV0dXJuIGJ1aWxkKGJ1ZmZlciwgcHJvamVjdCwgdG1kLCB2YWxpZGF0aW9uRW51bVR5cGUsIFZhbGlkYXRpb25UeXBlRW51bS5BVVRPX1ZBTElEQVRJT05fTkFNRSk7Ci0JCQl9Ci0JCQkKLQkJCWRlZmF1bHQ6IHsKLQkJCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRtZC5nZXROYW1lKCksIG51bGwsIElUZXN0U3RhdHVzLkZBSUwsIGJ1ZmZlciwgIlVucmVjb2duaXplZCB2YWxpZGF0aW9uIG9wdGlvbjoiICsgdmFsaWRhdGlvbkVudW1UeXBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYnVpbGQoSUJ1ZmZlciBidWZmZXIsIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCwgZmluYWwgaW50IHZhbGlkYXRpb25FbnVtVHlwZSwgU3RyaW5nIHN1YlRhc2tOYW1lKSB0aHJvd3MgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIG51bGxNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oCi0JCQluZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQl0cnkgewotCQkJCQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gdG1kLmdldFJlc291cmNlcyhwcm9qZWN0KTsKLQkJCQkJCWZvcihpbnQgaT0wOyBpPHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCUlSZXNvdXJjZSByZXMgPSByZXNvdXJjZXNbaV07Ci0JCQkJCQkJcmVzLnRvdWNoKG1vbml0b3IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQkJbG9nZ2VyLndyaXRlKGV4Yyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9LCBudWxsTW9uaXRvcik7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoZXhjKTsKLQkJCX0KLQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModG1kLmdldE5hbWUoKSwgc3ViVGFza05hbWUsIElUZXN0U3RhdHVzLkZBSUwsIGJ1ZmZlciwgIkNvcmVFeGNlcHRpb24gY2F1Z2h0OyBzdGFjayB0cmFjZSBpbiBMb2dnaW5nVXRpbC5sb2ciKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCS8vIERvIG5vdCBidWlsZCB1c2luZyBvbmx5IHRoZSB2YWxpZGF0aW9uIGJ1aWxkZXIgYmVjYXVzZSBzb21lIHZhbGlkYXRvcnMKLQkJCS8vIChpLmUuLCB0aGUgRUpCIFZhbGlkYXRvcikgZGVwZW5kIG9uIHRoZSBvdXRwdXQgb2Ygb3RoZXIgYnVpbGRlcnMgCi0JCQkvLyAoaS5lLiwgdGhlIEphdmEgQnVpbGRlcikuCi0JCQlwcm9qZWN0LmJ1aWxkKHZhbGlkYXRpb25FbnVtVHlwZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoZXhjKTsKLQkJCX0KLQkJCWJ1ZmZlci53cml0ZSgiQ29yZUV4Y2VwdGlvbiBjYXVnaHQ7IHN0YWNrIHRyYWNlIGluIExvZ2dpbmdVdGlsLmxvZyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJTWFya2VyW10gbWVzc2FnZXMgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIEludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yTmFtZXMobmV3IFZhbGlkYXRvck1ldGFEYXRhW117dG1kLmdldFZhbGlkYXRvck1ldGFEYXRhKCl9KSk7Ci0JCXJldHVybiB2ZXJpZnkoYnVmZmVyLCB0bWQuZ2V0TmFtZSgpLCBzdWJUYXNrTmFtZSwgcHJvamVjdCwgdG1kLmdldE1lc3NhZ2VzKHZhbGlkYXRpb25FbnVtVHlwZSksIG1lc3NhZ2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogUnVuIHRoZSBnaXZlbiBWYWxpZGF0aW9uT3BlcmF0aW9uIGFuZCBlbnN1cmUgdGhhdCB0aGUgcmVzdWx0cyBtYXRjaCB0aGUgcmVzdWx0cyBvZiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSByZXN1bHRzIG1hdGNoIGFuZCBmYWxzZSBpZiB0aGV5IGRvbid0LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHB1YmxpYyBiZWNhdXNlIGl0J3MgbmVlZGVkIGZvciB0aGUgVGVzdE9wQ29uc3RyIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgdGVzdE5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgTGlzdCBleHBlY3RlZE1lc3NhZ2VzLCBWYWxpZGF0aW9uT3BlcmF0aW9uIG9wLCBTdHJpbmdbXSB2YWxpZGF0b3JOYW1lcykgdGhyb3dzIEJWVFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlJUHJvZ3Jlc3NNb25pdG9yIGRlYnVnTW9uaXRvciA9IGdldERlYnVnTW9uaXRvcihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlib29sZWFuIHBhc3NlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQkKLQkJCWlmKG9wID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLldBUk5JTkcsICJDYW5ub3QgcnVuIHRlc3RzIGJlY2F1c2UgdGhlIE9wZXJhdGlvbiBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdHJ5IHsKLQkJCQkJCS8vVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuc2V0Tm9NZXNzYWdlTGltaXQob3AuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCi0JCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG9wLCBkZWJ1Z01vbml0b3IpOyAKLQkJCQkJCQotCQkJCQkJaWYob3AuaXNGb3JrKCkpIHsKLQkJCQkJCQkvLyBXYWl0IHVudGlsIGFsbCBmb3JrZWQgdGhyZWFkcyBhcmUgY29tcGxldGUKLQkJCQkJCQl3aGlsZSghVlRocmVhZE1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzRG9uZSgpKXt9OwotCQkJCQkJfQotCQkJCi0JCQkJCQkvLyBMb2FkIHRoZSBlbmFibGVkIHZhbGlkYXRvcnMgZnJvbSB0aGUgdGVzdCwgbm90IHRoZSBvcGVyYXRpb24sCi0JCQkJCQkvLyBiZWNhdXNlIHRoZSB0ZXN0IGhhcyB0aGUgbWVzc2FnZXMgZm9yIGEgc2luZ2xlIHZhbGlkYXRvciwgYW5kCi0JCQkJCQkvLyBpZiB0aGUgbWVzc2FnZXMgZnJvbSBhbGwgZW5hYmxlZCB2YWxpZGF0b3JzIGFyZSByZXRyaWV2ZWQsCi0JCQkJCQkvLyB0aGVuICJleHRyYSIgbWVzc2FnZXMsIHJlcG9ydGVkIGJ5IHZhbGlkYXRvcnMgd2hvc2UgbWVzc2FnZXMKLQkJCQkJCS8vIGFyZW4ndCBleHBlY3RlZCBieSB0aGUgdGVzdCwgZmFpbCB0aGUgdGVzdCBjYXNlLiAKLQkJCQkJCUlNYXJrZXJbXSBtZXNzYWdlcyA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3Mob3AuZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3JOYW1lcyk7Ci0JCQkJCQlwYXNzZWQgPSB2ZXJpZnkoYnVmZmVyLCB0ZXN0TmFtZSwgc3ViVGFza05hbWUsIG9wLmdldFByb2plY3QoKSwgZXhwZWN0ZWRNZXNzYWdlcywgbWVzc2FnZXMpOwotCQkJCX0KLQkJCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQkJfQotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCQlwYXNzZWQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldHVwVGVzdHMoSUJ1ZmZlciBidWZmZXIsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHZ0cyA9IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JUZXN0cyhidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIChTdHJpbmcpbnVsbCk7Ci0JCU9wZXJhdGlvblRlc3RjYXNlW10gb3RzID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldE9wZXJhdGlvblRlc3RzKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSwgKFN0cmluZyludWxsKTsKLQkJYm9vbGVhbiBzdWNjZXNzZnVsID0gdHJ1ZTsKLQkJZm9yKGludCBpPTA7IGk8dnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB2dGVzdCA9IHZ0c1tpXTsKLQkJCXN1Y2Nlc3NmdWwgPSBzZXR1cFRlc3RzKGJ1ZmZlciwgdnRlc3QsIGZhbHNlKSAmJiBzdWNjZXNzZnVsOwotCQl9Ci0JCQotCQlmb3IoaW50IGo9MDsgajxvdHMubGVuZ3RoOyBqKyspIHsKLQkJCU9wZXJhdGlvblRlc3RjYXNlIG90ZXN0ID0gb3RzW2pdOwotCQkJc3VjY2Vzc2Z1bCA9IHNldHVwVGVzdHMoYnVmZmVyLCBvdGVzdCwgZmFsc2UpICYmIHN1Y2Nlc3NmdWw7Ci0JCX0KLQkJCi0JCXJldHVybiBzdWNjZXNzZnVsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhbGwgb2YgdGhlIHRlc3QgY2FzZXMnIGlucHV0IHdlcmUgZm91bmQgYW5kIGltcG9ydGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldHVwVGVzdHMoSUJ1ZmZlciBidWZmZXIsIElUZXN0Y2FzZU1ldGFEYXRhIHRtZCwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCWludCBleGVjdXRpb25NYXAgPSAweDA7Ci0JCWJvb2xlYW4gaW1wb3J0ZWQgPSB0cnVlOwotCQl0cnkgewotCQkJQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLQkKLQkJCS8vIEVhY2ggaW1wb3J0IG9wZXJhdGlvbiBkZWxldGVzIGFueSBwcm9qZWN0IGJlZm9yZSBpdCByZS1pbXBvcnRzIGl0LgotCQkJU3RyaW5nIGRpciA9IFRlc3RjYXNlVXRpbGl0eS5nZXRJbnB1dERpcih0bWQpOwotCQkJVGVzdFNldHVwSW1wb3J0W10gc2V0dXAgPSByZWFkZXIuZ2V0VGVzdFNldHVwKGJ1ZmZlciwgZGlyLCB0bWQsIHZlcmJvc2UpOwotCQkJaWYoKHNldHVwID09IG51bGwpIHx8IChzZXR1cC5sZW5ndGggPT0gMCkpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJDYW5ub3QgaW1wb3J0IGlucHV0IHRoYXQgZG9lcyBub3QgZXhpc3QuIENoZWNrIHRoYXQgZGlyZWN0b3J5ICIgKyBkaXIgKyAiIGV4aXN0cy4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnVmZmVyLndyaXRlKG1lc3NhZ2UpOwotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDE7Ci0JCQkJaW1wb3J0ZWQgPSBmYWxzZTsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuYmVnaW5UYXNrKCJJbXBvcnRpbmcgZmlsZXM7IHBsZWFzZSB3YWl0Li4uIiwgc2V0dXAubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvcihpbnQgaT0wOyBpPHNldHVwLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJJbXBvcnRpbmcgZmlsZSAiICsgKGkrMSkgKyAiIG9mICIgKyBzZXR1cC5sZW5ndGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJaWYoIXNldHVwW2ldLmltcG9ydEZpbGUoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLCBkaXIpKSB7Ci0JCQkJCQkvLyBPbmUgb2YgdGhlIGlucHV0IGZpbGVzIGNvdWxkbid0IGJlIGltcG9ydGVkLgotCQkJCQkJZXhlY3V0aW9uTWFwIHw9IDB4MjsKLQkJCQkJCWltcG9ydGVkID0gZmFsc2U7Ci0JCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgIkltcG9ydCBmYWlsZWQgZm9yIGRpciAiICsgZGlyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmRvbmUoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKCFpbXBvcnRlZCkgewotCQkJCVN0cmluZyB0bWROYW1lID0gKHRtZCA9PSBudWxsKSA/ICI/IiA6IHRtZC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgCi0JCQkJCSJUZXN0IHNldHVwIGZvciAiICsgdG1kTmFtZSArICIgd2FzIHVuc3VjY2Vzc2Z1bC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltcG9ydGVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBleHBlY3RlZCBtZXNzYWdlcyAodG1kTW1kTGlzdCkgbWF0Y2hlcyB0aGUgcmVwb3J0ZWQgbWVzc2FnZXMgKG1sMikuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29tcGFyZShJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIExpc3QgdG1kTW1kTGlzdCwgSU1hcmtlcltdIG1sMikgewotCQkvLyBDb252ZXJ0IG9uZSBvZiB0aGUgYXJyYXlzIGludG8gYSBsaXN0IHNvIHRoYXQgaXQgY2FuIGJlIHNvcnRlZC4KLQkJaW50IG51bU1hdGNoZWQgPSAwOwotCQlMaXN0IG1tZExpc3QgPSBuZXcgQXJyYXlMaXN0KHRtZE1tZExpc3QpOyAvLyBjcmVhdGUgYSBjb3B5IG9mIHRoZSB0bWQncyBleHBlY3RlZCBvdXRwdXQgc28gdGhhdCB0aGUgdG1kJ3Mgb3V0cHV0IHJlbWFpbnMgaW50YWN0Ci0JCWludCBudW1FeHBlY3RlZCA9IG1tZExpc3Quc2l6ZSgpOwotCQlpbnQgbnVtUmVwb3J0ZWQgPSBtbDIubGVuZ3RoOwotCQlib29sZWFuIHBhc3NlZCA9IHRydWU7Ci0JCi0KLQkJdHJ5IHsJCQotCQkJQ29sbGVjdGlvbnMuc29ydChtbWRMaXN0LCBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlQ29tcGFyYXRvcihidWZmZXIsIGlzVmVyYm9zZSgpKSk7Ci0JCi0JCQl0cnkgewotCQkJCWZvcihpbnQgaT0wOyBpPG1sMi5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IG1sMltpXTsKLQkJCQkJTWVzc2FnZU1ldGFEYXRhIG1hdGNoaW5nID0gZ2V0TWF0Y2hpbmdNZXRhRGF0YShidWZmZXIsIG1tZExpc3QsIG1hcmtlcik7Ci0JCQkJCWlmKG1hdGNoaW5nID09IG51bGwpIHsKLQkJCQkJCV9leHRyYS5hZGQobWFya2VyKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gRXZlcnkgdGltZSBhIG1tZCBpcyBtYXRjaGVkIHRvIGEgbWFya2VyLCByZW1vdmUgdGhlIG1tZAotCQkJCQkJLy8gZnJvbSB0aGUgbGlzdCBzbyB0aGF0IG1tZHMgd2l0aG91dCBhIG1hcmtlciBjYW4gYmUgZmxhZ2dlZC4KLQkJCQkJCW1tZExpc3QucmVtb3ZlKG1hdGNoaW5nKTsKLQkJCQkJCW51bU1hdGNoZWQrKzsKLQkJCQkJfQotCQkJCX0KLQkKLQkJCQlpZihtbWRMaXN0LnNpemUoKSAhPSAwKSB7Ci0JCQkJCV9taXNzaW5nLmFkZEFsbChtbWRMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlwYXNzZWQgPSBwYXNzZWQgJiYgKChfbWlzc2luZy5zaXplKCkgPT0gMCkgJiYgKF9leHRyYS5zaXplKCkgPT0gMCkpOwotCQkJCQotCQkJCS8vIFJlcG9ydCB0aGUgbWlzc2luZyBtYXJrZXJzIGFmdGVyIHRoZSBNTUQgbGlzdCBpcyBzb3J0ZWQKLQkJCQlDb2xsZWN0aW9ucy5zb3J0KF9taXNzaW5nLCBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlQ29tcGFyYXRvcihidWZmZXIsIGlzVmVyYm9zZSgpKSk7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfbWlzc2luZy5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gKE1lc3NhZ2VNZXRhRGF0YSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBJVGVzdFN0YXR1cy5GQUlMLCBidWZmZXIsICJFUlJPUlttaXNzaW5nIG1lc3NhZ2VdOiAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobW1kKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gUmVwb3J0IHRoZSBleHRyYSBtYXJrZXJzIGFmdGVyIHRoZXkncmUgc29ydGVkLgotCQkJCUNvbGxlY3Rpb25zLnNvcnQoX2V4dHJhLCBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlQ29tcGFyYXRvcihidWZmZXIsIGlzVmVyYm9zZSgpKSk7Ci0JCQkJaXRlcmF0b3IgPSBfZXh0cmEuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBJVGVzdFN0YXR1cy5GQUlMLCBidWZmZXIsICJFUlJPUltleHRyYSBtZXNzYWdlXTogIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1hcmtlcikgKyAiLCBUZXh0IGlzOiBcIiIgKyBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlKG1hcmtlcikgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQotCQkJCWlmKG51bUV4cGVjdGVkICE9IG51bVJlcG9ydGVkKSB7Ci0JCQkJCWJ1ZmZlci53cml0ZSgiV3JvbmcgbnVtYmVyIG9mIG1lc3NhZ2VzIHJlcG9ydGVkLiBFeHBlY3RlZCAiICsgbnVtRXhwZWN0ZWQgKyAiIGFuZCBnb3QgIiArIG51bVJlcG9ydGVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQotCQkJCWJ1ZmZlci53cml0ZSgiTnVtYmVyIG9mIGV4dHJhIG1lc3NhZ2VzOiAiICsgX2V4dHJhLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIud3JpdGUoIk51bWJlciBvZiBtaXNzaW5nIG1lc3NhZ2VzOiAiICsgX21pc3Npbmcuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci53cml0ZSgiTnVtYmVyIG9mIG1hdGNoZWQgbWVzc2FnZXM6ICIgKyBudW1NYXRjaGVkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW1kTGlzdC5jbGVhcigpOwotCQkJX2V4dHJhLmNsZWFyKCk7IC8vIENsZWFyIHRoZSBsaXN0IG9mIGV4dHJhIG1hcmtlcnMgKHN0b3JlZCBpbiBhIGxpc3QgdG8gbWFrZSByZWFkaW5nIGVhc2llcikuCi0JCQlfbWlzc2luZy5jbGVhcigpOyAvLyBDbGVhciB0aGUgbGlzdCBvZiBtaXNzaW5nIG1hcmtlcnMgKHN0b3JlZCBpbiBhIGxpc3QgdG8gbWFrZSByZWFkaW5nIGVhc2llcikuCi0JCX0KLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmVyaWZ5KElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgdGVzdE5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgSVByb2plY3QgcHJvamVjdCwgTGlzdCBtbWRMaXN0T3JpZywgSU1hcmtlcltdIG1lc3NhZ2VzKSB7Ci0JCWJ1ZmZlci53cml0ZSgiVGVzdCBjYXNlOiAiICsgdGVzdE5hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJaW50IG51bU1hdGNoZWQgPSAwOwotCQlpbnQgbnVtRXhwZWN0ZWQgPSAwOwotCQlpbnQgbnVtUmVwb3J0ZWQgPSAwOwotCQlib29sZWFuIHBhc3NlZCA9IHRydWU7Ci0JCUxpc3QgbW1kTGlzdCA9IG5ldyBBcnJheUxpc3QobW1kTGlzdE9yaWcpOyAvLyBOZWVkIHRvIG1vZGlmeSB0aGUgbGlzdCwgYnV0IGRvIG5vdCB3YW50IHRvIG1vZGlmeSB0aGUgb3JpZ2luYWwsIHNvIGNyZWF0ZSBhIGNvcHkuCi0JCXRyeSB7Ci0JCQkvLyBGaXJzdCwgY2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIG1hdGNoLgotCQkJaWYobWVzc2FnZXMgPT0gbnVsbCkgewotCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5JTkZPKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuSU5GTywgIk5vIG1lc3NhZ2VzIHdlcmUgcmVwb3J0ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIHBhc3NlZDsKLQkJCX0KLQkJCQotCQkJbnVtRXhwZWN0ZWQgPSBtbWRMaXN0LnNpemUoKTsKLQkJCW51bVJlcG9ydGVkID0gbWVzc2FnZXMubGVuZ3RoOwotCQkJCi0JCQlDb2xsZWN0aW9ucy5zb3J0KG1tZExpc3QsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGJ1ZmZlciwgaXNWZXJib3NlKCkpKTsKLQotCQkJZm9yKGludCBpPTA7IGk8bWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTWFya2VyIG1hcmtlciA9IG1lc3NhZ2VzW2ldOwotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBnZXRNYXRjaGluZ01ldGFEYXRhKGJ1ZmZlciwgbW1kTGlzdCwgbWFya2VyKTsKLQkKLQkJCQlpZihtbWQgPT0gbnVsbCkgewotCQkJCQlfZXh0cmEuYWRkKG1hcmtlcik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gRXZlcnkgdGltZSBhIG1tZCBpcyBtYXRjaGVkIHRvIGEgbWFya2VyLCByZW1vdmUgdGhlIG1tZAotCQkJCQkvLyBmcm9tIHRoZSBsaXN0IHNvIHRoYXQgbW1kcyB3aXRob3V0IGEgbWFya2VyIGNhbiBiZSBmbGFnZ2VkLgotCQkJCQltbWRMaXN0LnJlbW92ZShtbWQpOwotCQkJCQlpZihpc1ZlcmJvc2UoKSkgewotCQkJCQkJYnVmZmVyLndyaXRlKCJtYXRjaGVkICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtYXJrZXIpICsgIiB0byAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobW1kKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCW51bU1hdGNoZWQrKzsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gQ2hlY2sgc2V2ZXJpdHkKLQkJCQl0cnkgewotCQkJCQkvLyBGYWlsIGEgdGVzdCBjYXNlIGJhc2VkIG9uIHNldmVyaXR5IG1pc21hdGNoIGJlY2F1c2UgRUpCIGRlcGxveQotCQkJCQkvLyByZWxpZXMgb24gdGhlIHNldmVyaXR5IHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBkZXBsb3ltZW50Ci0JCQkJCS8vIGNhbiBjb250aW51ZT8KLQkJCQkJdmVyaWZ5U2V2ZXJpdHkoYnVmZmVyLCB0ZXN0TmFtZSwgc3ViVGFza05hbWUsIG1tZCwgbWFya2VyKTsKLQkJCQl9Ci0JCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGUpOwotCQkJCQl9Ci0JCQkJCWJ1ZmZlci53cml0ZSgiRVJST1JbVGVzdGNhc2U6OiIgKyB0ZXN0TmFtZSArICJdLiBDb3JlRXhjZXB0aW9uIGNhdWdodCB3aGlsZSB2ZXJpZnlpbmcgc2V2ZXJpdHkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBDaGVjayByZXNvdXJjZQotCQkJCXRyeSB7Ci0JCQkJCS8vIERvbid0IGZhaWwgYSB0ZXN0IGNhc2UgYmFzZWQgb24gcmVzb3VyY2UsIGJlY2F1c2UgdGhlICJsb2NhdGlvbiIgY29sdW1uIHdpbGwKLQkJCQkJLy8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLCBhbnl3YXkuIFNob3VsZCBzdGlsbCBsZXQgdGhlIAotCQkJCQkvLyB1c2VyIGtub3csIHRob3VnaC4KLQkJCQkJdmVyaWZ5UmVzb3VyY2UoYnVmZmVyLCB0ZXN0TmFtZSwgc3ViVGFza05hbWUsIG1tZCwgbWFya2VyKTsKLQkJCQl9Ci0JCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlidWZmZXIud3JpdGUoIkVSUk9SW1Rlc3RjYXNlOjoiICsgdGVzdE5hbWUgKyAiXS4gQ29yZUV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgdmVyaWZ5aW5nIHJlc291cmNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGUpOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBDaGVjayBsb2NhdGlvbgotCQkJCXRyeSB7Ci0JCQkJCS8vIERvbid0IGZhaWwgYSB0ZXN0IGNhc2UgYmFzZWQgb24gbG9jYXRpb24sIGJlY2F1c2UgdGhlIGxpbmUgbnVtYmVyIGNhbGN1bGF0aW9uCi0JCQkJCS8vIGlzIGRpZmZlcmVudCBpbiBVSSAmIGJhdGNoLCBhbmQgdGhlIHRlc3QgY2FzZXMgYXJlIGJhc2VkIG9uIFVJIHRlc3QgcmVzdWx0cy4KLQkJCQkJLy8gU2hvdWxkIHN0aWxsIGFsZXJ0IHRoZSB1c2VyLCB0aG91Z2guCi0JCQkJCXZlcmlmeUxvY2F0aW9uKGJ1ZmZlciwgdGVzdE5hbWUsIHN1YlRhc2tOYW1lLCAgbW1kLCBtYXJrZXIpOwotCQkJCX0KLQkJCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZSk7Ci0JCQkJCX0KLQkJCQkJYnVmZmVyLndyaXRlKCJFUlJPUltUZXN0Y2FzZTo6IiArIHRlc3ROYW1lICsgIl0uIENvcmVFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIHZlcmlmeWluZyBsaW5lIG51bWJlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihtbWRMaXN0LnNpemUoKSAhPSAwKSB7Ci0JCQkJX21pc3NpbmcuYWRkQWxsKG1tZExpc3QpOwotCQkJfQotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcGFzc2VkID0gZmFsc2U7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZighKChfbWlzc2luZy5zaXplKCkgPT0gMCkgJiYgKF9leHRyYS5zaXplKCkgPT0gMCkpKSB7Ci0JCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCWlmKHBhc3NlZCkgewotCQkJCWJ1ZmZlci53cml0ZSgiUEFTU1tUZXN0Y2FzZTo6IiArIHRlc3ROYW1lICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0TmFtZSwgc3ViVGFza05hbWUsIHRydWUpOyAvLyBJZiBmYWlsLCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBleHRyYSAmIG1pc3NpbmcgYmVsb3cuCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlidWZmZXIud3JpdGUoIkZBSUxbVGVzdGNhc2U6OiIgKyB0ZXN0TmFtZSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJLy8gTm8gcG9pbnQgaW4gbGlzdGluZyB0aGUgbW1kTGlzdCBiZWNhdXNlIGl0J3MgZW1wdHkgYnkgdGhlIHRpbWUgdGhlIGZpbmFsbHkgYmxvY2sgaXMgcmVhY2hlZAotCQkJCWlmKGlzVmVyYm9zZSgpKSB7Ci0JCQkJCWJ1ZmZlci53cml0ZSgiTGlzdCBvZiBtYXJrZXJzIHJlcG9ydGVkOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWRlYnVnKGJ1ZmZlciwgbWVzc2FnZXMpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gUmVwb3J0IHRoZSBtaXNzaW5nIG1hcmtlcnMgYWZ0ZXIgdGhlIE1NRCBsaXN0IGlzIHNvcnRlZAotCQkJQ29sbGVjdGlvbnMuc29ydChfbWlzc2luZywgTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZUNvbXBhcmF0b3IoYnVmZmVyLCBpc1ZlcmJvc2UoKSkpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfbWlzc2luZy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IChNZXNzYWdlTWV0YURhdGEpaXRlcmF0b3IubmV4dCgpOwotCQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBJVGVzdFN0YXR1cy5GQUlMLCBidWZmZXIsICJFUlJPUlttaXNzaW5nIG1lc3NhZ2VdOiAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobW1kKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJLy8gUmVwb3J0IHRoZSBleHRyYSBtYXJrZXJzIGFmdGVyIHRoZXkncmUgc29ydGVkLgotCQkJQ29sbGVjdGlvbnMuc29ydChfZXh0cmEsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGJ1ZmZlciwgaXNWZXJib3NlKCkpKTsKLQkJCWl0ZXJhdG9yID0gX2V4dHJhLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgSVRlc3RTdGF0dXMuRkFJTCwgYnVmZmVyLCAiRVJST1JbZXh0cmEgbWVzc2FnZV06ICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtYXJrZXIpICsgIiwgVGV4dCBpczogXCIiICsgTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZShtYXJrZXIpICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCi0JCQlpZihudW1FeHBlY3RlZCAhPSBudW1SZXBvcnRlZCkgewotCQkJCWJ1ZmZlci53cml0ZSgiV3JvbmcgbnVtYmVyIG9mIG1lc3NhZ2VzIHJlcG9ydGVkLiBFeHBlY3RlZCAiICsgbnVtRXhwZWN0ZWQgKyAiIGFuZCBnb3QgIiArIG51bVJlcG9ydGVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWJ1ZmZlci53cml0ZSgiTnVtYmVyIG9mIGV4dHJhIG1lc3NhZ2VzOiAiICsgX2V4dHJhLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci53cml0ZSgiTnVtYmVyIG9mIG1pc3NpbmcgbWVzc2FnZXM6ICIgKyBfbWlzc2luZy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIud3JpdGUoIk51bWJlciBvZiBtYXRjaGVkIG1lc3NhZ2VzOiAiICsgbnVtTWF0Y2hlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci53cml0ZSgiRW5kIG9mIHRlc3QgY2FzZTogIiArIHRlc3ROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJX2V4dHJhLmNsZWFyKCk7IC8vIENsZWFyIHRoZSBsaXN0IG9mIGV4dHJhIG1hcmtlcnMgKHN0b3JlZCBpbiBhIGxpc3QgdG8gbWFrZSByZWFkaW5nIGVhc2llcikuCi0JCQlfbWlzc2luZy5jbGVhcigpOyAvLyBDbGVhciB0aGUgbGlzdCBvZiBtaXNzaW5nIG1hcmtlcnMgKHN0b3JlZCBpbiBhIGxpc3QgdG8gbWFrZSByZWFkaW5nIGVhc2llcikuCi0JCX0KLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgdmVyaWZ5U2V2ZXJpdHkoSUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0ZXN0TmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBNZXNzYWdlTWV0YURhdGEgbW1kLCBJTWFya2VyIG1hcmtlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBJZiBwcmVmaXhTZXZlcml0eSBpcyBudWxsLCBtYXJrZXIgaGFzIG5vIHByZWZpeCwgdGhlcmVmb3JlIGl0IGhhcyBubyBzZXZlcml0eQotCQlJbnRlZ2VyIHByZWZpeFNldmVyaXR5ID0gTWVzc2FnZVV0aWxpdHkuZ2V0U2V2ZXJpdHkobWFya2VyKTsKLQkJaWYocHJlZml4U2V2ZXJpdHkgIT0gbnVsbCkgewotCQkJSW50ZWdlciBzZXZlcml0eSA9IChJbnRlZ2VyKW1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSk7IC8vIElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPCi0JCQlib29sZWFuIHNldmVyaXR5RXF1YWwgPSB0cnVlOwotCQkJaWYoKHNldmVyaXR5ID09IG51bGwpICYmIChwcmVmaXhTZXZlcml0eSA9PSBudWxsKSkgewotCQkJCXNldmVyaXR5RXF1YWwgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZihzZXZlcml0eSA9PSBudWxsKSB7Ci0JCQkJc2V2ZXJpdHlFcXVhbCA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZihwcmVmaXhTZXZlcml0eSA9PSBudWxsKSB7Ci0JCQkJc2V2ZXJpdHlFcXVhbCA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V2ZXJpdHlFcXVhbCA9IHNldmVyaXR5LmVxdWFscyhwcmVmaXhTZXZlcml0eSk7Ci0JCQl9Ci0JCQkKLQkJCWlmKCFzZXZlcml0eUVxdWFsKSB7Ci0JCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0TmFtZSwgc3ViVGFza05hbWUsIElUZXN0U3RhdHVzLldBUk4sIGJ1ZmZlciwgIldBUk5JTkdbbWlzbWF0Y2hpbmcgc2V2ZXJpdHldOiBleHBlY3RlZCAiICsgZ2V0U2V2ZXJpdHlDaGFyKHByZWZpeFNldmVyaXR5KSArICIsIGdvdCAiICsgZ2V0U2V2ZXJpdHlDaGFyKHNldmVyaXR5KSArICIgb24gbWFya2VyICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtYXJrZXIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlyZXR1cm4gSVRlc3RTdGF0dXMuV0FSTjsKLQkJCX0KLQkJfQotCQkJCi0JCXJldHVybiBJVGVzdFN0YXR1cy5QQVNTOwotCX0KLQkKLQlwcml2YXRlIGludCB2ZXJpZnlSZXNvdXJjZShJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIE1lc3NhZ2VNZXRhRGF0YSBtbWQsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyByZXNvdXJjZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFJlc291cmNlKG1hcmtlcik7Ci0JCWlmKCFyZXNvdXJjZS5lcXVhbHMobW1kLmdldFJlc291cmNlKCkpKSB7Ci0JCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgSVRlc3RTdGF0dXMuV0FSTiwgYnVmZmVyLCAiSU5GT1t3cm9uZyByZXNvdXJjZV06IGV4cGVjdGVkICIgKyBtbWQuZ2V0UmVzb3VyY2UoKSArICIsIGdvdCAiICsgcmVzb3VyY2UgKyAiIG9uIG1hcmtlciAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobWFya2VyKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlyZXR1cm4gSVRlc3RTdGF0dXMuV0FSTjsKLQkJfQotCQlyZXR1cm4gSVRlc3RTdGF0dXMuUEFTUzsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgdmVyaWZ5TG9jYXRpb24oSUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0ZXN0TmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBNZXNzYWdlTWV0YURhdGEgbW1kLCBJTWFya2VyIG1hcmtlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBFaXRoZXIgY29tcGFyZSB0d28gbGluZSBudW1iZXJzIG9yIHR3byB0ZXh0IGxvY2F0aW9ucywgYnV0IG5vdCBhIGxpbmUgbnVtYmVyIHRvIGEgdGV4dCBsb2NhdGlvbi4KLQkJaWYobW1kLmlzU2V0TGluZU51bWJlcigpKSB7Ci0JCQlJbnRlZ2VyIGxpbmVOdW1iZXIgPSBNZXNzYWdlVXRpbGl0eS5nZXRMaW5lTnVtYmVyKG1hcmtlcik7Ci0JCQlpZihsaW5lTnVtYmVyID09IG51bGwpIHsKLQkJCQkvLyBNYXJrZXIgaGFzIGEgdGV4dCBsb2NhdGlvbiwgbm90IGEgbGluZSBudW1iZXIuCi0JCQkJcmV0dXJuIElUZXN0U3RhdHVzLlBBU1M7Ci0JCQl9Ci0JCQkKLQkJCWlmKGxpbmVOdW1iZXIuaW50VmFsdWUoKSAhPSBtbWQuZ2V0TGluZU51bWJlcigpKSB7Ci0JCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0TmFtZSwgc3ViVGFza05hbWUsIElUZXN0U3RhdHVzLldBUk4sIGJ1ZmZlciwgIklORk9bd3JvbmcgbG9jYXRpb25dOiBleHBlY3RlZCAiICsgbW1kLmdldExpbmVOdW1iZXIoKSArICIsIGdvdCAiICsgbGluZU51bWJlciArICIgb24gbWFya2VyICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtYXJrZXIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlyZXR1cm4gSVRlc3RTdGF0dXMuV0FSTjsKLQkJCX0KLQkJfQotCQllbHNlIGlmKG1tZC5pc1NldExvY2F0aW9uKCkpIHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IE1lc3NhZ2VVdGlsaXR5LmdldExvY2F0aW9uKG1hcmtlcik7Ci0JCQlpZihsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJLy8gbWFya2VyIGhhcyBhIGxpbmUgbnVtYmVyLCBub3QgYSB0ZXh0IGxvY2F0aW9uCi0JCQkJcmV0dXJuIElUZXN0U3RhdHVzLlBBU1M7Ci0JCQl9Ci0JCQkKLQkJCWlmKCEobW1kLmdldExvY2F0aW9uKCkuZXF1YWxzKGxvY2F0aW9uKSkpIHsKLQkJCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgSVRlc3RTdGF0dXMuV0FSTiwgYnVmZmVyLCAiSU5GT1t3cm9uZyBsb2NhdGlvbl06IGV4cGVjdGVkICIgKyBtbWQuZ2V0TG9jYXRpb24oKSArICIsIGdvdCAiICsgbG9jYXRpb24gKyAiIG9uIG1hcmtlciAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobWFya2VyKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJcmV0dXJuIElUZXN0U3RhdHVzLldBUk47Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBJVGVzdFN0YXR1cy5QQVNTOwotCX0KLQkKLQkKLQlwcml2YXRlIE1lc3NhZ2VNZXRhRGF0YSBnZXRNYXRjaGluZ01ldGFEYXRhKElCdWZmZXIgYnVmZmVyLCBMaXN0IG1tZExpc3QsIElNYXJrZXIgbWFya2VyKSB7Ci0JCWludCByZXN1bHQgPSBDb2xsZWN0aW9ucy5iaW5hcnlTZWFyY2gobW1kTGlzdCwgbWFya2VyLCBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlQ29tcGFyYXRvcihidWZmZXIsIGlzVmVyYm9zZSgpKSk7Ci0JCWlmKHJlc3VsdCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoTWVzc2FnZU1ldGFEYXRhKW1tZExpc3QuZ2V0KHJlc3VsdCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQlZUVmFsaWRhdGlvblV0aWxpdHkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQlZUVmFsaWRhdGlvblV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmZjBlZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC91dGlsL0JWVFZhbGlkYXRpb25VdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMSBNeUNvcnBvcmF0aW9uLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5CVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5JVGVzdGNhc2VNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5Lk9wZXJhdGlvblRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVGVzdGNhc2VVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQlZUVmFsaWRhdGlvblV0aWxpdHkgewotCXByaXZhdGUgQlZUVmFsaWRhdGlvblV0aWxpdHkoKSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yTWV0YURhdGEoSU1hcmtlciBtYXJrZXIpIHsKLQkJU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2YWxpZGF0b3JDbGFzc05hbWUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkFMSURBVElPTl9NQVJLRVJfT1dORVIpLnRvU3RyaW5nKCk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEodmFsaWRhdG9yQ2xhc3NOYW1lKTsKLQkJCXJldHVybiB2bWQ7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCUlNYXJrZXJbXSBhbGxNYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WQUxJREFUSU9OX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7IC8vIGZhbHNlIG1lYW5zIG9ubHkgY29uc2lkZXIgUFJPQkxFTV9NQVJLRVIsIG5vdCB2YXJpYW50cyBvZiBQUk9CTEVNX01BUktFUi4gU2luY2UgYWRkVGFzayBvbmx5IGFkZHMgUFJPQkxFTV9NQVJLRVIsIHdlIGRvbid0IG5lZWQgdG8gY29uc2lkZXIgaXRzIHN1YnR5cGVzLgotCQkJcmV0dXJuIGFsbE1hcmtlcnM7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVmFsaWRhdGlvbk1hcmtlcnMoKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlUm9vdCByb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRWYWxpZGF0aW9uVGFza3Mocm9vdCk7Ci0JCWlmKG1hcmtlcnMgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl3b3Jrc3BhY2UuZGVsZXRlTWFya2VycyhtYXJrZXJzKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQlpbnQgZXh0SW5kZXggPSBmaWxlTmFtZS5pbmRleE9mKCcuJyk7Ci0JCWlmKGV4dEluZGV4ID4gMCkgewotCQkJcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZygwLCBleHRJbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRRdWFsaWZpZWRMb2dOYW1lKFN0cmluZyBsb2dGaWxlTmFtZSkgewotCQlTdHJpbmcgZGlyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlGaWxlIGRpcldpdGhGaWxlID0gbmV3IEZpbGUoZGlyLCBsb2dGaWxlTmFtZSk7Ci0JCXJldHVybiBkaXJXaXRoRmlsZS50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0UHJvamVjdHMoSVRlc3RjYXNlTWV0YURhdGFbXSB0bWRzKSB7Ci0JCUxpc3Qgc29ydGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKGludCBpPTA7IGk8dG1kcy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcCA9IFRlc3RjYXNlVXRpbGl0eS5maW5kUHJvamVjdCh0bWRzW2ldKTsKLQkJCWlmKChwICE9IG51bGwpICYmIChwLmV4aXN0cygpKSAmJiAocC5pc09wZW4oKSkgJiYgIXNvcnRlZExpc3QuY29udGFpbnMocCkpIHsKLQkJCQlzb3J0ZWRMaXN0LmFkZChwKTsKLQkJCX0KLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZExpc3QsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYil7Ci0JCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQllbHNlIGlmKGIgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCi0JCQkJaWYoKGEgaW5zdGFuY2VvZiBJUHJvamVjdCkgJiYgKGIgaW5zdGFuY2VvZiBJUHJvamVjdCkpIHsKLQkJCQkJcmV0dXJuICgoSVByb2plY3QpYSkuZ2V0TmFtZSgpLmNvbXBhcmVUbygoKElQcm9qZWN0KWIpLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiAtMTsgLy8gc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUuLi5ib3RoIE9iamVjdHMgc2hvdWxkIGFsd2F5cyBiZSBJUHJvamVjdHMKLQkJCX0KLQkJfSk7Ci0JCUlQcm9qZWN0W10gcmVzdWx0ID0gbmV3IElQcm9qZWN0W3NvcnRlZExpc3Quc2l6ZSgpXTsKLQkJc29ydGVkTGlzdC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVGVzdGNhc2VNZXRhRGF0YVtdIGdldFRlc3RzKElUZXN0Y2FzZU1ldGFEYXRhW10gdG1kcywgSVByb2plY3QgcCkgewotCQlJVGVzdGNhc2VNZXRhRGF0YVtdIHRlbXAgPSBuZXcgSVRlc3RjYXNlTWV0YURhdGFbdG1kcy5sZW5ndGhdOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IoaW50IGk9MDsgaTx0bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVGVzdGNhc2VNZXRhRGF0YSB0bWQgPSB0bWRzW2ldOwotCQkJaWYodG1kLmdldFByb2plY3ROYW1lKCkuZXF1YWxzKHAuZ2V0TmFtZSgpKSkgewotCQkJCXRlbXBbY291bnQrK10gPSB0bWQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlUZXN0Y2FzZU1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IElUZXN0Y2FzZU1ldGFEYXRhW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiB2YWxpZGF0b3IgdGVzdHMuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgaW50IG51bVZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3RbXSBwcm9qZWN0cykgdGhyb3dzIEJWVFZhbGlkYXRpb25FeGNlcHRpb24gewkKLQkJQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLQkJCi0JCWludCB0b3RhbFRlc3RzID0gMDsKLQkJZm9yKGludCBpPTA7IGk8cHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gdGVzdHMgPSByZWFkZXIuZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgcHJvamVjdCk7Ci0JCQlpZigodGVzdHMgPT0gbnVsbCkgfHwgKHRlc3RzLmxlbmd0aCA9PSAwKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQl0b3RhbFRlc3RzICs9IHRlc3RzLmxlbmd0aDsKLQkJfQotCQkKLQkJcmV0dXJuIHRvdGFsVGVzdHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbGwgcHVibGljICh2aXNpYmxlKSB0ZXN0IGNhc2VzIGZvciBhIHBhcnRpY3VsYXIgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvclRlc3RjYXNlW10gZ2V0VmFsaWRhdG9yVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdFtdIHByb2plY3RzKSB7Ci0JCVNldCB0ZXN0U2V0ID0gbmV3IEhhc2hTZXQoKTsJCQotCQlmb3IoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0ZXN0cyA9IGdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHByb2plY3QpOwotCQkJaWYodGVzdHMubGVuZ3RoID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJZm9yKGludCBqPTA7IGo8dGVzdHMubGVuZ3RoOyBqKyspIHsKLQkJCQlWYWxpZGF0b3JUZXN0Y2FzZSB2dCA9IHRlc3RzW2pdOwotCQkJCXRlc3RTZXQuYWRkKHZ0KTsKLQkJCX0KLQkJfQotCQkKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbdGVzdFNldC5zaXplKCldOwotCQl0ZXN0U2V0LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHZpc2libGUgdmFsaWRhdG9yIHRlc3QgY2FzZXMgZm9yIGEgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvclRlc3RjYXNlW10gZ2V0VmFsaWRhdG9yVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciByZWFkZXIgPSBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCk7Ci0KLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0ZXN0cyA9IHJlYWRlci5nZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCBwcm9qZWN0KTsKLQkJaWYodGVzdHMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVswXTsKLQkJfQotCQkKLQkJcmV0dXJuIHRlc3RzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgb2YgdGhlIHRlc3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uVGVzdGNhc2VbXSBnZXRPcGVyYXRpb25UZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRPcGVyYXRpb25UZXN0cyhtb25pdG9yLCAoU3RyaW5nKW51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9wZXJhdGlvblRlc3RjYXNlW10gZ2V0T3BlcmF0aW9uVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciByZWFkZXIgPSBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCk7Ci0KLQkJT3BlcmF0aW9uVGVzdGNhc2VbXSB0ZXN0cyA9IHJlYWRlci5nZXRPcGVyYXRpb25UZXN0cyhtb25pdG9yLCBwcm9qZWN0KTsKLQkJaWYodGVzdHMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBPcGVyYXRpb25UZXN0Y2FzZVswXTsKLQkJfQotCQkKLQkJcmV0dXJuIHRlc3RzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgb2YgdGhlIHRlc3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCAoU3RyaW5nKW51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIG9mIHRoZSB0ZXN0cywgdmlzaWJsZSBhbmQgaW52aXNpYmxlLCBvd25lZCBieSB0aGUgdmFsaWRhdG9yIG1ldGFkYXRhLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIGFsbFRlc3RzID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIChTdHJpbmcpbnVsbCk7Ci0JCVZhbGlkYXRvclRlc3RjYXNlW10gdGVtcCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVthbGxUZXN0cy5sZW5ndGhdOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IoaW50IGk9MDsgaTxhbGxUZXN0cy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yVGVzdGNhc2UgdGVzdHZtZCA9IGFsbFRlc3RzW2ldOwotCQkJaWYodm1kLmVxdWFscyh0ZXN0dm1kLmdldFZhbGlkYXRvck1ldGFEYXRhKCkpKSB7Ci0JCQkJdGVtcFtjb3VudCsrXSA9IHRlc3R2bWQ7Ci0JCQl9Ci0JCX0KLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0VmFsaWRhdG9yc1RoYXRIYXZlVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVZhbGlkYXRvclRlc3RjYXNlW10gdGVzdHMgPSBnZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yKTsKLQkJU2V0IHRlbXAgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IoaW50IGk9MDsgaTx0ZXN0cy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yVGVzdGNhc2UgdnQgPSB0ZXN0c1tpXTsKLQkJCXRlbXAuYWRkKHZ0LmdldFZhbGlkYXRvck1ldGFEYXRhKCkpOwotCQl9Ci0JCQotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbdGVtcC5zaXplKCldOwotCQl0ZW1wLnRvQXJyYXkodm1kcyk7Ci0JCXJldHVybiB2bWRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQnVpbGRJbmZvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC91dGlsL0J1aWxkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjYxMmFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQnVpbGRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsOwotcHVibGljIGNsYXNzIEJ1aWxkSW5mbyB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICJMaWNlbnNlZCBNYXRlcmlhbHMgLS0gUHJvcGVydHkgb2YgSUJNXG4oYykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIDIwMDEsMjAwM1xuVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ0J1aWxkTGV2ZWwgPSAiMjAwMzExMTJfMTkxNS1XQjIxMi1BRC1WNTExRC1XNSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTQUJ1aWxkTGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvUnVuVGVzdHNPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvUnVuVGVzdHNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyYjAzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC91dGlsL1J1blRlc3RzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuSVRlc3RjYXNlTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotCi0KLS8qKgotICogUnVuIHRoZSBCVlQgb2YgdGhlIHZhbGlkYXRvcjogYSBmdWxsIHRlc3QsIGFuIGluY3JlbWVudGFsIHRlc3QsCi0gKiBhbmQgYW4gYXN5bmNocm9ub3VzIHRlc3QsIGlmIGFwcGxpY2FibGUuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBOT1QgYmUgd3JhcHBlZCBpbiBhbiBJV29ya3NwYWNlUnVubmFibGUgb3IgCi0gKiB0aGVyZSB3aWxsIGJlIGRlYWRsb2NrIGR1cmluZyB0aGUgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gdGVzdCEKLSAqIChSZWFkIHRoZSBjb21tZW50IGFib3ZlIFZUaHJlYWRNYW5hZ2VyOjppc0RvbmUoKSBmb3IgZGV0YWlscy4pCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5UZXN0c09wZXJhdGlvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgUnVuVGVzdHNPcGVyYXRpb24gX2luc3QgPSBudWxsOwotCQotCXByaXZhdGUgUnVuVGVzdHNPcGVyYXRpb24oKSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUnVuVGVzdHNPcGVyYXRpb24gc2luZ2xldG9uKCkgewotCQlpZihfaW5zdCA9PSBudWxsKSB7Ci0JCQlfaW5zdCA9IG5ldyBSdW5UZXN0c09wZXJhdGlvbigpOwotCQl9Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElCdWZmZXIgYnVmZmVyLCBJVGVzdGNhc2VNZXRhRGF0YVtdIGFsbFRtZHMpIHsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IEJWVFZhbGlkYXRpb25VdGlsaXR5LmdldFByb2plY3RzKGFsbFRtZHMpOwotCQlmb3IoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJSVRlc3RjYXNlTWV0YURhdGFbXSB0bWRzID0gQlZUVmFsaWRhdGlvblV0aWxpdHkuZ2V0VGVzdHMoYWxsVG1kcywgcHJvamVjdCk7Ci0JCQkKLQkJCWZvcihpbnQgaj0wOyBqPHRtZHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJVGVzdGNhc2VNZXRhRGF0YSB0bWQgPSB0bWRzW2pdOwotCQkJCXRtZC5ydW4oYnVmZmVyLCBwcm9qZWN0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvQUltcG9ydE9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvQUltcG9ydE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDEyOGI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0FJbXBvcnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFZhbGlkYXRpb25VdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgdGhhdCBwcm92aWRlcyBzb21lIG9mIHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVkIHRvIGNyZWF0ZQotICogYSBwcm9qZWN0IGFuZCBwb3B1bGF0ZSBpdCB3aXRoIHRoZSBjb250ZW50cyBvZiBhIGZpbGUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBSW1wb3J0T3BlcmF0aW9uIGltcGxlbWVudHMgSUltcG9ydE9wZXJhdGlvbiB7Ci0JcHJpdmF0ZSB2b2lkIHByZVJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuc3VzcGVuZEFsbFZhbGlkYXRpb24odHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3N0UnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5zdXNwZW5kQWxsVmFsaWRhdGlvbihmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU9sZFByb2plY3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJLy8gZGVsZXRlIGFueSBleGlzdGluZyBwcm9qZWN0IG9mIHRoaXMgbmFtZQotCQlJUHJvamVjdCBleGlzdGluZ1Byb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAoZXhpc3RpbmdQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCWV4aXN0aW5nUHJvamVjdC5kZWxldGUodHJ1ZSwgbnVsbCk7IC8vIG51bGw9bm8gcHJvZ3Jlc3MgbW9uIChkb24ndCBzY2FyZSB1c2VycykKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCUJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgRmlsZSBmaWxlKSB7Ci0JCWJvb2xlYW4gaW1wb3J0ZWQgPSB0cnVlOwotCQlpbnQgZXhlY3V0aW9uTWFwID0gMHgwOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJfQotCQkJCi0JCQlwcmVSdW4obW9uaXRvcik7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gQlZUVmFsaWRhdGlvblV0aWxpdHkuZ2V0UHJvamVjdE5hbWUoZmlsZSk7Ci0JCQkJZGVsZXRlT2xkUHJvamVjdChtb25pdG9yLCBwcm9qZWN0TmFtZSk7Ci0JCQkJcHJvamVjdCA9IGNyZWF0ZU5ld1Byb2plY3QobW9uaXRvciwgcHJvamVjdE5hbWUsIGZpbGUpOwotCQkJCQotCQkJCWlmKChwcm9qZWN0ID09IG51bGwpIHx8ICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkpIHsKLQkJCQkJZXhlY3V0aW9uTWFwIHw9IDB4MTsKLQkJCQkJaW1wb3J0ZWQgPSBmYWxzZTsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiQ2Fubm90IGltcG9ydCBmaWxlIGJlY2F1c2UgSVByb2plY3QgaXMgbnVsbCBvciBub3QgYWNjZXNzaWJsZS4iOyAvLyROT04tTkxTLTEkCi0JCQkJCW1vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsKLQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIHsJCQkJCi0JCQkJCWltcG9ydGVkID0gaW1wb3J0RmlsZShtb25pdG9yLCBwcm9qZWN0LCBmaWxlKTsKLQkJCQkJZXhlY3V0aW9uTWFwIHw9IDB4MjsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDQ7Ci0JCQkJaW1wb3J0ZWQgPSBmYWxzZTsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJcG9zdFJ1bihtb25pdG9yKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKCFpbXBvcnRlZCkgewotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IChwcm9qZWN0ID09IG51bGwpID8gZmlsZS5nZXROYW1lKCkgOiBwcm9qZWN0LmdldE5hbWUoKTsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgCi0JCQkJCSJBSW1wb3J0T3BlcmF0aW9uIGZvciAiICsgcHJvamVjdE5hbWUgKyAiIHdhcyB1bnN1Y2Nlc3NmdWwuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCXJldHVybiBpbXBvcnRlZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IElQcm9qZWN0IGNyZWF0ZU5ld1Byb2plY3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgcHJvamVjdE5hbWUsIEZpbGUgaW5wdXRGaWxlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgaW1wb3J0ZWQgc3VjY2Vzc2Z1bGx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGltcG9ydEZpbGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBGaWxlIGZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvQnVpbGRJbmZvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9CdWlsZEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1ZGNiZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9CdWlsZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwOwotcHVibGljIGNsYXNzIEJ1aWxkSW5mbyB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICJMaWNlbnNlZCBNYXRlcmlhbHMgLS0gUHJvcGVydHkgb2YgSUJNXG4oYykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIDIwMDEsMjAwM1xuVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ0J1aWxkTGV2ZWwgPSAiMjAwMzExMTJfMTkxNS1XQjIxMi1BRC1WNTExRC1XNSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTQUJ1aWxkTGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0NoZWNrRm9yVW50ZXN0ZWRQcm9wZXJ0aWVzT3BlcmF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9DaGVja0ZvclVudGVzdGVkUHJvcGVydGllc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWM3MjM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0NoZWNrRm9yVW50ZXN0ZWRQcm9wZXJ0aWVzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5Qcm9wZXJ0eUxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLndvcmtiZW5jaGltcGwuUGx1Z2luUHJvcGVydHlGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LlZhbGlkYXRpb25UeXBlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5Lk1lc3NhZ2VVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFZhbGlkYXRpb25VdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotLyoqCi0gKiBHZW5lcmF0ZSBhIEZWVCB0ZXN0IGNhc2UgZm9yIGV2ZXJ5IEVKQiBWYWxpZGF0b3IgdmFsaWRhdGlvbiBtYXJrZXIgb24gZWFjaAotICogc2VsZWN0ZWQgcHJvamVjdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENoZWNrRm9yVW50ZXN0ZWRQcm9wZXJ0aWVzT3BlcmF0aW9uIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIF92bWQgPSBudWxsOwotCXByaXZhdGUgSUJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcmVzb3VyY2VCdW5kbGVOYW1lID0gbnVsbDsKLQlwdWJsaWMgQ2hlY2tGb3JVbnRlc3RlZFByb3BlcnRpZXNPcGVyYXRpb24oSUJ1ZmZlciBidWZmZXIsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSkgewotCQlzZXRWYWxpZGF0b3JNZXRhRGF0YSh2bWQpOwotCQlzZXRCdWZmZXIoYnVmZmVyKTsKLQkJc2V0UmVzb3VyY2VCdW5kbGVOYW1lKHJlc291cmNlQnVuZGxlTmFtZSk7Ci0JfQotCXB1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJcmV0dXJuIF9idWZmZXI7Ci0JfQotCXZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYikgewotCQlfYnVmZmVyID0gYjsKLQl9Ci0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvck1ldGFEYXRhKCkgewotCQlyZXR1cm4gX3ZtZDsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGx1Z2luSWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPIFJlbW92ZSB0aGlzIGhhY2sgb25jZSBhIGdldHRlciBoYXMgYmVlbiBhZGRlZCB0byBWYWxpZGF0b3JNZXRhRGF0YSBmb3IgaXRzIHBsdWdpbklkLgotCQkJaWYgKHZtZCAhPSBudWxsKSB7Ci0JCQkJQ2xhc3NMb2FkZXIgY2wgPSB2bWQuZ2V0VmFsaWRhdG9yKCkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQkJCUlQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JCQkJSVBsdWdpbkRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHJlZ2lzdHJ5LmdldFBsdWdpbkRlc2NyaXB0b3JzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlJUGx1Z2luRGVzY3JpcHRvciBkZXNjID0gZGVzY3JpcHRvcnNbaV07Ci0JCQkJCWlmIChkZXNjLmdldFBsdWdpbkNsYXNzTG9hZGVyKCkuZXF1YWxzKGNsKSkgewotCQkJCQkJcmV0dXJuIGRlc2MuZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0Jdm9pZCBzZXRWYWxpZGF0b3JNZXRhRGF0YShWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJX3ZtZCA9IHZtZDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiBfcmVzb3VyY2VCdW5kbGVOYW1lOwotCX0KLQl2b2lkIHNldFJlc291cmNlQnVuZGxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlfcmVzb3VyY2VCdW5kbGVOYW1lID0gbmFtZTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IHBMaW5lcyA9IG51bGw7Ci0JCUxpc3QgdW50ZXN0ZWRMaW5lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0ZXN0ZWRMaW5lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZVByZWZpeENvbXBhcmF0b3IoKTsKLQkJLy8gQXNzdW1lIHRoYXQgdGhlIEJWVCB0ZXN0cyB3ZXJlIHJ1biBvbiB0aGUgcHJvamVjdHMgYmVmb3JlIHRoaXMgbWVudQotCQkvLyBhY3Rpb24gd2FzIGNsaWNrZWQuCi0JCS8vIExvYWQgYW5kIHBhcnNlIHRoZSAucHJvcGVydGllcyBmaWxlIHRvIGtub3cgd2hhdCBtZXNzYWdlIGlkcyB0byBsb29rCi0JCS8vIGZvci4KLQkJU3RyaW5nIHByb3BGaWxlTmFtZSA9IGdldFJlc291cmNlQnVuZGxlTmFtZSgpOwotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpOwotCQltb25pdG9yLnN1YlRhc2soIkF0dGVtcHRpbmcgdG8gbG9hZCBmaWxlOiAiICsgcHJvcEZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcGx1Z2luSWQgPSBnZXRQbHVnaW5JZCh2bWQpOwotCQlpZiAocGx1Z2luSWQgPT0gbnVsbCkgewotCQkJU3RyaW5nIG1zZyA9ICJDYW5ub3QgbG9hZCBwbHVnaW4gaWQgZm9yIHZhbGlkYXRvciAiICsgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCk7Ly8kTk9OLU5MUy0xJAkKLQkJCW1vbml0b3Iuc3ViVGFzayhtc2cpOyAJCQotCQkJQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2coTGV2ZWwuU0VWRVJFLCBtc2cpOyAKLQkJCXJldHVybjsKLQkJfQotCQlQbHVnaW5Qcm9wZXJ0eUZpbGUgcEZpbGUgPSBuZXcgUGx1Z2luUHJvcGVydHlGaWxlKHBsdWdpbklkLCBwcm9wRmlsZU5hbWUpOwotCQltb25pdG9yLndvcmtlZCgxKTsKLQkJbW9uaXRvci5zdWJUYXNrKCJQYXJzaW5nLiIpOyAvLyROT04tTkxTLTEkCi0JCXBMaW5lcyA9IHBGaWxlLmdldFByb3BlcnR5TGluZXMoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChwTGluZXMsIGNvbXBhcmF0b3IpOyAvLyBmYWxzZSA9IG5vIHZlcmJvc2Ugb3V0cHV0Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCQltb25pdG9yLnN1YlRhc2soIkxvYWRpbmcgdGVzdCBtZXNzYWdlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRtZHMgPSBCVlRWYWxpZGF0aW9uVXRpbGl0eS5nZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCB2bWQpOwotCQlmb3IgKGludCBrID0gMDsgayA8IHRtZHMubGVuZ3RoOyBrKyspIHsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIHRtZCA9IHRtZHNba107Ci0JCQlMaXN0IG1zc2cgPSB0bWQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKTsKLQkJCXRlc3RlZExpbmVzLmFkZEFsbChtc3NnKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHRlc3RlZExpbmVzLCBjb21wYXJhdG9yKTsKLQkJbW9uaXRvci5zdWJUYXNrKCJDb21wYXJpbmcuIik7IC8vJE5PTi1OTFMtMSQKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwTGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWludCBpbmRleCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaCh0ZXN0ZWRMaW5lcywgbGluZSwgY29tcGFyYXRvcik7Ci0JCQlpZiAoaW5kZXggPCAwKSB7Ci0JCQkJLy8gbm90IGZvdW5kLgotCQkJCXVudGVzdGVkTGluZXMuYWRkKGxpbmUpOwotCQkJfQotCQl9Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCQkvLyBub3cgc2VlIGlmIHRoZSBsaXN0IG9mIHVudGVzdGVkIGxpbmVzIGhhcyBlbnRyaWVzLgotCQlDb2xsZWN0aW9ucy5zb3J0KHVudGVzdGVkTGluZXMsIGNvbXBhcmF0b3IpOwotCQlJdGVyYXRvciB1bnRlc3RlZGl0ZXJhdG9yID0gdW50ZXN0ZWRMaW5lcy5pdGVyYXRvcigpOwotCQlpZiAodW50ZXN0ZWRpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWdldEJ1ZmZlcigpLndyaXRlKCJMaXN0IG9mIG1lc3NhZ2VzIHdoaWNoIGFyZSBub3QgdGVzdGVkICgiICsgdW50ZXN0ZWRMaW5lcy5zaXplKCkgKyAiIG9mICIgKyBwTGluZXMuc2l6ZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfSBlbHNlIHsKLQkJCWdldEJ1ZmZlcigpLndyaXRlKCJBbGwgbWVzc2FnZXMgYXJlIHRlc3RlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXdoaWxlICh1bnRlc3RlZGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKXVudGVzdGVkaXRlcmF0b3IubmV4dCgpOwotCQkJZ2V0QnVmZmVyKCkud3JpdGUobGluZS50b1N0cmluZygpKTsKLQkJfQotCQl1bnRlc3RlZExpbmVzLmNsZWFyKCk7IC8vIGNsZWFyIHRoZSBsaXN0IGZvciB0aGUgbmV4dCBwcm9qZWN0Ci0JCXRlc3RlZExpbmVzLmNsZWFyKCk7Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lCdWZmZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwYmM4MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBJZiBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSByZXBvcnRlZCB0byB0aGUgdXNlciwgYnV0IHRoYXQgaW5mb3JtYXRpb24gaXMgbG9uZywKLSAqIGFuZCB0aGUgdXNlciBuZWVkcyB0byBzZWUgaXQgYWxsIGF0IHRoZSBzYW1lIHRpbWUgKGUuZy4sIHRlc3QgY2FzZSByZXN1bHRzKSwKLSAqIHRoZW4gdGhlIGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIHRvIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzLiAKLSAqIEltcGxlbWVudGF0aW9ucyBjYW4gY2hvb3NlIHRvIHJlcG9ydCB0aGUgaW5mb3JtYXRpb24gaW1tZWRpYXRlbHkgCi0gKiAoZS5nLiwgdG8gU3lzdGVtLm91dCksIG9yIGNhbiBhcHBlbmQgZWFjaCBtZXNzYWdlLCBhbmQgcmVwb3J0IHRoZSBtZXNzYWdlCi0gKiBvbmx5IG9uY2UgZXZlcnl0aGluZyBpcyBjb21wbGV0ZS4gCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJ1ZmZlciBleHRlbmRzIElUZXN0U3RhdHVzIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2dyZXNzIG1vbml0b3IgdGhhdCBpcyB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MKLQkgKiBzdGF0dXMgYXMgdGhlIGxvbmctcnVubmluZyBwcm9jZXNzIGV4ZWN1dGVzLgotCSAqLwotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpOwotCQotCS8qKgotCSAqIERpc3BsYXkgdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXI7IHRoZSBidWZmZXIgaW1wbGVtZW50YXRpb24gbWF5IAotCSAqIGRpc3BsYXkgdGhlIG1lc3NhZ2UgaW1tZWRpYXRlbHksIG9yIG1heSBkaXNwbGF5IHRoZSBtZXNzYWdlIG9ubHkKLQkgKiB3aGVuIHJlcG9ydCgpIGlzIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgbWVzc2FnZSk7Ci0JCi0JLyoqCi0JICogQmV0d2VlbiBvbmUgdGFzayBhbmQgdGhlIG5leHQsIHVzdWFsbHkgYmV0d2VlbiB0ZXN0IGNhc2VzLCBhZGQgYSBkZWxpbmVhdGluZwotCSAqIG1hcmsgdG8gc2hvdyB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgZWFjaCB0YXNrIGNsZWFybHkuIFRoZSBwYXJhbWV0ZXIgCi0JICogcGFzc2VkIGluLCB0YXNrTmFtZSwgaXMgdGhlIG5hbWUgb2YgdGhlIHRhc2sgdGhhdCBpcyBlbmRpbmcuCi0JICovCi0JcHVibGljIHZvaWQgZGVsaW5lYXRlKFN0cmluZyB0YXNrTmFtZSk7Ci0JCQotCS8qKgotCSAqIElmIGluZm9ybWF0aW9uIHdhcyBub3QgcmVwb3J0ZWQgaW1tZWRpYXRlbHksIGNhbGxpbmcgdGhpcyBtZXRob2QKLQkgKiBmb3JjZXMgdGhlIGJ1ZmZlciB0byBiZSByZXBvcnRlZCB0byB0aGUgdXNlci4gVGhlIGNvbnRlbnRzIG9mIHRoZQotCSAqIGJ1ZmZlciBhcmUgbm90IGNsZWFyZWQ7IGEgc3Vic2VxZW50IGNhbGwgdG8gdGhpcyBtZXRob2Qgd2lsbCAKLQkgKiByZXBlYXQgd2hhdCBoYXMgYmVlbiByZXBvcnRlZCBiZWZvcmUuIEFueSBjYWxscyB0byBlbGFwc2VkVGltZQotCSAqIHdpbGwgYmUgcmVwb3J0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3J0KCk7Ci0JCi0JLyoqCi0JICogQ2xlYXIgYW55IHN0b3JlZCBtZXNzYWdlcyBmcm9tIHRoZSBidWZmZXIsIGJ1dCBub3QgYW55IGVsYXBzZWRUaW1lIAotCSAqIG51bWJlcnMgZnJvbSB0aGUgc3RvcmUuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBsb2cgZmlsZSwgb3IgbnVsbCBpZiBub25lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9nRmlsZU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lJbXBvcnRPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lJbXBvcnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFkMGQwNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JSW1wb3J0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXA7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIEFsbCB2YWxpZGF0aW9uIEZWVCB0ZXN0cyBtdXN0IHByb3ZpZGUgYW4gSUltcG9ydE9wZXJhdGlvbiBpbXBsZW1lbnRhdGlvbgotICogdG8gaW1wb3J0IHRoZSBpbnB1dCBmaWxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbXBvcnRPcGVyYXRpb24gewotCS8qKgotCSAqIFJ1bnMgdGhpcyBvcGVyYXRpb24gd2l0aG91dCBmb3JjaW5nIGEgVUkgZGVwZW5kZW5jeS4gUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUKLQkgKiB3YXMgZm91bmQgYW5kIGltcG9ydGVkIHN1Y2Nlc3NmdWxseS4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzIGFuZCByZWNlaXZlCi0JICogICByZXF1ZXN0cyBmb3IgY2FuY2VsYXRpb24KLQkgKiBAcGFyYW0gaW5wdXRGaWxlIHRoZSBmaWxlIHdoaWNoIG5lZWRzIHRvIGJlIGltcG9ydGVkIGludG8gdGhlIHdvcmtiZW5jaAotCSAqIEBleGNlcHRpb24gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpZiB0aGUgcnVuIG1ldGhvZCBtdXN0IHByb3BhZ2F0ZSBhIGNoZWNrZWQgZXhjZXB0aW9uLAotCSAqIAlpdCBzaG91bGQgd3JhcCBpdCBpbnNpZGUgYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT47IHJ1bnRpbWUgZXhjZXB0aW9ucyBhcmUgYXV0b21hdGljYWxseQotCSAqICB3cmFwcGVkIGluIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+IGJ5IHRoZSBjYWxsaW5nIGNvbnRleHQKLQkgKiBAZXhjZXB0aW9uIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZGV0ZWN0cyBhIHJlcXVlc3QgdG8gY2FuY2VsLCAKLQkgKiAgdXNpbmcgPGNvZGU+SVByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk8L2NvZGU+LCBpdCBzaG91bGQgZXhpdCBieSB0aHJvd2luZyAKLQkgKiAgPGNvZGU+SW50ZXJydXB0ZWRFeGNlcHRpb248L2NvZGU+Ci0JICoKLQkgKiBAc2VlIElSdW5uYWJsZVdpdGhQcm9ncmVzcwotCSAqLwotCXB1YmxpYyBib29sZWFuIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIEZpbGUgaW5wdXRGaWxlKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JVGVzdFN0YXR1cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSVRlc3RTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyYjkzNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JVGVzdFN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwOwotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGludGVyZmFjZSB0cmFjayB0aGUgZXhlY3V0aW9uIG9mIGEgdGVzdCBjYXNlLAotICogYW5kIGFyZSB1c2VkIHRvIHJlcG9ydCBhIHN1bW1hcnkgb2YgdGhlIGV4ZWN1dGlvbiBvZiBhbGwgb2YgdGhlCi0gKiB0ZXN0IGNhc2VzIGF0IHRoZSBlbmQgb2YgYSBzZXQgb2YgdGVzdCBydW5zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXN0U3RhdHVzIHsKLQlwdWJsaWMgZmluYWwgaW50IFBBU1MgPSAwOwotCXB1YmxpYyBmaW5hbCBpbnQgV0FSTiA9IDE7Ci0JcHVibGljIGZpbmFsIGludCBGQUlMID0gMjsKLQkKLQkvKioKLQkgKiBUbyB0cmFjayBob3cgbG9uZyBhIHRhc2sgdGFrZXMsIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBhIHVuaXF1ZSBuYW1lCi0JICogb2YgdGhlIHRhc2suIElmIHRoZSB0YXNrIGFscmVhZHkgZXhpc3RzLCB0aGUgZWxhcHNlZFRpbWUgaXMgYWRkZWQKLQkgKiB0byB0aGUgZXhpc3RpbmcgdGltZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbGFwc2VkVGltZShTdHJpbmcgdGFza05hbWUsIGxvbmcgZWxhcHNlZFRpbWUpOwotCQotCS8qKgotCSAqIElmIHBhc3MgaXMgdHJ1ZSwgUEFTUyBpcyB1c2VkOyBpZiBwYXNzIGlzIGZhbHNlLCBGQUlMIGlzIHVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0UGFzc05hbWUsIGJvb2xlYW4gcGFzcyk7Ci0JCi0JLyoqCi0JICogSWYgcGFzcyBpcyB0cnVlLCBQQVNTIGlzIHVzZWQ7IGlmIHBhc3MgaXMgZmFsc2UsIEZBSUwgaXMgdXNlZC4KLQkgKiBXaGlsZSBzdGlsbCBjb25zaWRlcmVkIHBhcnQgb2YgdGVzdCBjYXNlICJ0ZXN0UGFzc05hbWUiLCB0aGlzIAotCSAqIHNwbGl0cyB0aGlzIHBhcnQgb2YgdGhlIHRlc3QgY2FzZSBpbnRvIGEgc2VjdGlvbiBuYW1lZCAic3ViVGFza05hbWUiLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdFBhc3NOYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIGJvb2xlYW4gcGFzcyk7Ci0JCi0JLyoqCi0JICogQXMgZWFjaCB0ZXN0IGlzIGV4ZWN1dGVkLCB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIHRyYWNrIGhvdyBtYW55IG9mIHRoYXQKLQkgKiB0eXBlIG9mIHRlc3QgcGFzcyBvciBmYWlsLiBwYXNzT3JGYWlsIGNhbiBiZSBvbmUgb2YgdGhyZWUgdmFsdWVzOiBQQVNTLCBXQVJOLCBvciBGQUlMLgotCSAqIElmIHZhbHVlIGlzIFBBU1MsIHRoZW4gdGhlIHRlc3QgY2FzZSBwYXNzZXMsIGFuZCBubyBtZXNzYWdlIG5lZWRzIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4KLQkgKiBJZiB2YWx1ZSBpcyBXQVJOLCB0aGVuIHRoZSB0ZXN0IGNhc2UgcGFzc2VzLCBhbmQgYSB3YXJuaW5nIG1lc3NhZ2UgbXVzdCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi0JICogSWYgdmFsdWUgaXMgRkFJTCwgdGhlbiB0aGUgdGVzdCBjYXNlIGZhaWxzLCBhbmQgYSBmYWlsdXJlIG1lc3NhZ2UgbXVzdCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0Y2FzZU5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgaW50IHBhc3NPckZhaWwsIElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbWVzc2FnZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSB0ZXN0IGNhc2VzIHJ1biBzbyBmYXIgaGF2ZSBwYXNzZWQ7IG90aGVyd2lzZQotCSAqIHJldHVybiBmYWxzZS4gSWYgbm8gdGVzdCBjYXNlcyBoYXZlIHJ1biwgcmV0dXJuIHRydWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZSBwYXNzZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKFN0cmluZyB0ZXN0TmFtZSk7Ci0JCi0JLyoqCi0JICogUmVzZXQgYWxsIHZhcmlhYmxlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZSB0byBwcmVwYXJlIHRoaXMgdGVzdCBzdGF0dXMgZm9yIHJldXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9KQVJJbXBvcnRPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0pBUkltcG9ydE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjg2ODc1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0pBUkltcG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotCi0vKioKLSAqIENyZWF0ZSBhIEphdmEgcHJvamVjdCBieSBpbXBvcnRpbmcgYSBKQVIgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIEpBUkltcG9ydE9wZXJhdGlvbiBleHRlbmRzIEFJbXBvcnRPcGVyYXRpb24gewotCS8vIE1vc3Qgb2YgdGhlIGNvZGUgaW4gdGhpcyBjbGFzcyB3YXMgc3RvbGVuIGZyb20gdGhlIEpEVC4gU2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmJ1aWxkcGF0aHMuQnVpbGRQYXRoc0Jsb2NrLgotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElQYXRoIGxvY2F0aW9uUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3I9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0JCQkJCi0KLQkJLy8gY3JlYXRlIHRoZSBwcm9qZWN0Ci0JCXRyeSB7Ci0JCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2M9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkubmV3UHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5lcXVhbHMobG9jYXRpb25QYXRoKSkgewotCQkJCQlsb2NhdGlvblBhdGg9IG51bGw7Ci0JCQkJfQotCQkJCWRlc2Muc2V0TG9jYXRpb24obG9jYXRpb25QYXRoKTsKLQkJCQlwcm9qZWN0LmNyZWF0ZShkZXNjLCBtb25pdG9yKTsKLQkJCQltb25pdG9yPSBudWxsOwotCQkJfQotCQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJcHJvamVjdC5vcGVuKG1vbml0b3IpOwotCQkJCW1vbml0b3I9IG51bGw7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkSmF2YU5hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJU3RyaW5nW10gcHJldk5hdHVyZXM9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJU3RyaW5nW10gbmV3TmF0dXJlcz0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCQluZXdOYXR1cmVzW3ByZXZOYXR1cmVzLmxlbmd0aF09IEphdmFDb3JlLk5BVFVSRV9JRDsKLQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVByb2plY3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQkvLyBTZXQgdGhlIGNsYXNzcGF0aCB0byB0aGUgZGVmYXVsdC4KLQkJCUlKYXZhUHJvamVjdCBqcCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWpwLnNldFJhd0NsYXNzcGF0aChudWxsLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDcpKTsJCQotCi0JCQkvLyBOb3cgYWRkIHJ0LmphciB0byBpdAotCQkJSUNsYXNzcGF0aEVudHJ5W10gZXhpc3RpbmdDbGFzc3BhdGggPSBqcC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aD0gbmV3IElDbGFzc3BhdGhFbnRyeVtleGlzdGluZ0NsYXNzcGF0aC5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZXhpc3RpbmdDbGFzc3BhdGgsIDAsIGNsYXNzcGF0aCwgMCwgZXhpc3RpbmdDbGFzc3BhdGgubGVuZ3RoKTsKLQkJCUlDbGFzc3BhdGhFbnRyeSBydEphciA9IEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkobmV3IFBhdGgoIkpSRV9MSUIiKSwgbmV3IFBhdGgoIkpSRV9TUkMiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJY2xhc3NwYXRoW2V4aXN0aW5nQ2xhc3NwYXRoLmxlbmd0aF0gPSBydEphcjsKLQkJCWpwLnNldFJhd0NsYXNzcGF0aChjbGFzc3BhdGgsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNykpOwotCQkJCi0JCQkvLyBFbmFibGUgdGhpcyBqYXZhIHByb2plY3Qgd2l0aCB0aGUgVmFsaWRhdGlvbiBCdWlsZGVyIHNvIHRoYXQgYXV0b21hdGljIHZhbGlkYXRpb24gCi0JCQkvLyBjYW4gcnVuIG9uIGl0LgotCQkJVmFsaWRhdG9yTWFuYWdlci5hZGRQcm9qZWN0QnVpbGRWYWxpZGF0aW9uU3VwcG9ydChwcm9qZWN0KTsKLQkJfQotCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZXhjKSB7Ci0JCQlCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5BSW1wb3J0T3BlcmF0aW9uI2NyZWF0ZU5ld1Byb2plY3QoSVByb2dyZXNzTW9uaXRvciwgU3RyaW5nLCBGaWxlKQotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdCBjcmVhdGVOZXdQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIHByb2plY3ROYW1lLCBGaWxlIGlucHV0RmlsZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJdHJ5IHsKLQkJCWNyZWF0ZVByb2plY3QocHJvamVjdCwgbnVsbCwgbW9uaXRvcik7Ci0JCQlhZGRKYXZhTmF0dXJlKHByb2plY3QsIG1vbml0b3IpOwotCQkJY29uZmlndXJlUHJvamVjdChtb25pdG9yLCBwcm9qZWN0KTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJfQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9sZGVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgSVBhdGggcGF0aG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihwYXRobmFtZSk7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gZm9sZGVyLmdldFBhcmVudCgpOwotCQlpZighY29udGFpbmVyLmV4aXN0cygpKSB7Ci0JCQljcmVhdGVGb2xkZXIobW9uaXRvciwgcHJvamVjdCwgY29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCX0KLQkJaWYoIWZvbGRlci5leGlzdHMoKSkgewotCQkJLy8gRG9uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzLgotCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBtb25pdG9yKTsgLy8gdHJ1ZT1mb3JjZSwgdHJ1ZT1sb2NhbAotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBwYXRobmFtZSwgSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGaWxlIG5maWxlID0gcHJvamVjdC5nZXRGaWxlKHBhdGhuYW1lKTsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBuZmlsZS5nZXRQYXJlbnQoKTsKLQkJaWYoIWNvbnRhaW5lci5leGlzdHMoKSkgewotCQkJY3JlYXRlRm9sZGVyKG1vbml0b3IsIHByb2plY3QsIGNvbnRhaW5lci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQl9Ci0JCWlmKCFuZmlsZS5leGlzdHMoKSkgewotCQkJLy8gRG9uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzLgotCQkJbmZpbGUuY3JlYXRlKHN0cmVhbSwgdHJ1ZSwgbW9uaXRvcik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLkFJbXBvcnRPcGVyYXRpb24jaW1wb3J0RmlsZShJUHJvZ3Jlc3NNb25pdG9yLCBJUHJvamVjdCwgRmlsZSkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBvcnRGaWxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgRmlsZSBmaWxlKSB7Ci0JCS8vIEltcG9ydCB0aGUgZmlsZSAKLQkJdHJ5IHsKLQkJCVppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGZpbGUpOwotCQkJRW51bWVyYXRpb24gemlwRW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOwotCQkJd2hpbGUoemlwRW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVppcEVudHJ5IHppcEVudHJ5ID0gKFppcEVudHJ5KXppcEVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCQlJUGF0aCBwYXRobmFtZSA9IG5ldyBQYXRoKHppcEVudHJ5LmdldE5hbWUoKSk7Ci0JCQkJaWYoemlwRW50cnkuaXNEaXJlY3RvcnkoKSkgewotCQkJCQljcmVhdGVGb2xkZXIobW9uaXRvciwgcHJvamVjdCwgcGF0aG5hbWUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY3JlYXRlRmlsZShtb25pdG9yLCBwcm9qZWN0LCBwYXRobmFtZSwgemlwRmlsZS5nZXRJbnB1dFN0cmVhbSh6aXBFbnRyeSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWNhdGNoKElPRXhjZXB0aW9uIGV4YykgewotCQkJQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvVGVzdENhc2VHZW5lcmF0b3JPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL1Rlc3RDYXNlR2VuZXJhdG9yT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWEyZTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvVGVzdENhc2VHZW5lcmF0b3JPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXA7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5Lk1lc3NhZ2VVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRhc2tMaXN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIEdlbmVyYXRlIGFuIEZWVCB0ZXN0IGNhc2UsIGZvciBhIHNlbGVjdGVkIElQcm9qZWN0IG9yIElQcm9qZWN0cywgdG8KLSAqIGJlIHBhc3RlZCBpbnRvIHBsdWdpbi54bWwuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXN0Q2FzZUdlbmVyYXRvck9wZXJhdGlvbiBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9URVNUQ0FTRV9URU1QTEFURV8gPSAiXHRcdFx0PHRlc3QgXG5cdFx0XHRcdHByb2plY3Q9XCJ7MH1cIlxuXHRcdFx0XHRpbnB1dD1cIlwiXG5cdFx0XHRcdHZhbGlkYXRvcj1cInsxfVwiPlxuezJ9XHRcdFx0PC90ZXN0PlxuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfVEVTVENBU0VfTUVTU0FHRV9URU1QTEFURV8gPSAiXHRcdFx0XHQ8bWVzc2FnZSBwcmVmaXg9XCJ7MH1cIiByZXNvdXJjZT1cInsxfVwiIGxvY2F0aW9uPVwiezJ9XCIgdGV4dD1cInszfVwiLz5cbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE1hcCBfdm1kQnVmZmVyID0gbnVsbDsgLy8gbWFwIHdoZXJlIHRoZSBWYWxpZGF0b3JNZXRhRGF0YSBpcyB0aGUga2V5IGFuZCB0aGUgdmFsdWUgaXMgYSBTdHJpbmdCdWZmZXIKLQlwcml2YXRlIElQcm9qZWN0W10gX3Byb2plY3RzID0gbnVsbDsKLQlwcml2YXRlIElCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0JCi0JcHVibGljIFRlc3RDYXNlR2VuZXJhdG9yT3BlcmF0aW9uKElQcm9qZWN0W10gcHJvamVjdHMsIElCdWZmZXIgYnVmZmVyKSB7Ci0JCXNldFByb2plY3RzKHByb2plY3RzKTsKLQkJc2V0QnVmZmVyKGJ1ZmZlcik7Ci0JCV92bWRCdWZmZXIgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGJ1ZmZlciB3aGVyZSB0aGUgdGVzdCBjYXNlIGdlbmVyYXRlZCBvdXRwdXQgd2lsbCBiZSBzZW50LgotCSAqLwotCXB1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJcmV0dXJuIF9idWZmZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGIpIHsKLQkJX2J1ZmZlciA9IGI7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdFtdIGdldFByb2plY3RzKCkgewotCQlyZXR1cm4gX3Byb2plY3RzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0cyhJUHJvamVjdFtdIHByb2plY3RzKSB7Ci0JCV9wcm9qZWN0cyA9IHByb2plY3RzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlI3J1bihJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFyZzApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWdlbmVyYXRlKGdldFByb2plY3RzKCkpOwotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCQlnZXRCdWZmZXIoKS53cml0ZSgiQSBUaHJvd2FibGUgd2FzIGNhdWdodDsgY291bGQgbm90IGdlbmVyYXRlIHRoZSB0ZXN0IGNhc2UuIENoZWNrIHRoZSBMb2dnaW5nVXRpbC5sb2cgZmlsZSBmb3IgZGV0YWlscy4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZpbmFsbHkgewotCQkJX3ZtZEJ1ZmZlci5jbGVhcigpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlKElQcm9qZWN0W10gcHJvamVjdHMpIHsKLQkJLy8gRmlyc3QsIGxvYWQgYWxsIG9mIHRoZSB2YWxpZGF0aW9uIG1hcmtlcnMgZnJvbSB0aGUgc2VsZWN0ZWQgcHJvamVjdHMsIAotCQkvLyBhbmQgZ3JvdXAgdGhlbSBieSB0aGUgdmFsaWRhdG9yLgotCQlmb3IoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQlpZigobWFya2VycyA9PSBudWxsKSB8fCAobWFya2Vycy5sZW5ndGggPT0gMCkpewotCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJDYW5ub3QgZ2VuZXJhdGUgYSB0ZXN0IGNhc2UgZm9yIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiB1bnRpbCBcIlJ1biBWYWxpZGF0aW9uXCIgaGFzIGJlZW4gcnVuLiBFbmFibGUgb25seSB0aGUgdmFsaWRhdG9yIHdob3NlIHRlc3QgY2FzZSBpcyB0byBiZSBnZW5lcmF0ZWQsIHJpZ2h0LWNsaWNrLCBhbmQgXCJSdW4gVmFsaWRhdGlvblwiLiBPbmNlIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGhhdmUgYmVlbiByZXBvcnRlZCwgYSB0ZXN0IGNhc2UgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIHRob3NlIG1lc3NhZ2VzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJLy8gQSB0ZXN0IGNhc2UgPSBvbmUgdmFsaWRhdG9yIG9uIG9uZSBwcm9qZWN0ID0+IHdoYXQgbWFya2VycwotCQkJTGlzdCBtYXJrZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yKGludCBqPTA7IGo8bWFya2Vycy5sZW5ndGg7IGorKykgewotCQkJCW1hcmtlckxpc3QuYWRkKG1hcmtlcnNbal0pOwotCQkJfQotCQkJCi0JCQkvLyBTb3J0IHRoZSBtYXJrZXJzIGJ5IHZhbGlkYXRvciwgcHJvamVjdCwgcHJlZml4LCBsb2NhdGlvbiAmIHJlc291cmNlCi0JCQlDb2xsZWN0aW9ucy5zb3J0KG1hcmtlckxpc3QsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGdldEJ1ZmZlcigpLCBmYWxzZSkpOwotCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IG1hcmtlckxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwkJCQotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IE1lc3NhZ2VVdGlsaXR5LmdldFZhbGlkYXRvcihtYXJrZXIpOwotCQkJCWlmKHZtZCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBtZXNzYWdlQnVmZmVyID0gZ2V0QnVmZmVyKHZtZCk7Ci0JCQkJCVN0cmluZyBtZXNzYWdlSWQgPSBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlUHJlZml4KG1hcmtlcik7Ci0JCQkJCVN0cmluZyByZXNvdXJjZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFJlc291cmNlKG1hcmtlcik7Ci0JCQkJCUludGVnZXIgbGluZU51bWJlciA9IE1lc3NhZ2VVdGlsaXR5LmdldExpbmVOdW1iZXIobWFya2VyKTsKLQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gKGxpbmVOdW1iZXIgPT0gbnVsbCkgPyAobG9jYXRpb24gPSBNZXNzYWdlVXRpbGl0eS5nZXRMb2NhdGlvbihtYXJrZXIpKSA6IChsb2NhdGlvbiA9IGxpbmVOdW1iZXIudG9TdHJpbmcoKSk7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZShtYXJrZXIpOyAvLyBFbWl0IHRoZSB0ZXh0IG9mIHRoZSBtZXNzYWdlIHNvIHRoYXQsIGlmIHRoZSBtZXNzYWdlIHByZWZpeGVzIGFyZSBjaGFuZ2VkIGluIHRoZSBmdXR1cmUsIGl0J3MgZWFzeSB0byBzZWUgdGhhdCB0aGUgc2FtZSB0ZXN0IGlzIHJ1biB3aXRoIGEgZGlmZmVyZW50IHByZWZpeCwgYW5kIHRoYXQgdGhlIHRlc3QgZGlkbid0IHJlYWxseSBmYWlsLgotCQkJCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKCc8JywgJ1snKTsgLy8gcmVtb3ZlIHRoZSBYTUwgcmVzZXJ2ZWQgY2hhcmFjdGVycy4KLQkJCQkJdGV4dCA9IHRleHQucmVwbGFjZSgnPicsICddJyk7Ci0JCQkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoJyInLCAnXCcnKTsKLQkJCQkJbWVzc2FnZUJ1ZmZlci5hcHBlbmQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoX1RFU1RDQVNFX01FU1NBR0VfVEVNUExBVEVfLCBuZXcgU3RyaW5nW117bWVzc2FnZUlkLCByZXNvdXJjZSwgbG9jYXRpb24sIHRleHR9KSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpdGVyYXRvciA9IF92bWRCdWZmZXIua2V5U2V0KCkuaXRlcmF0b3IoKTsgLy8gaXRlcmF0ZSBvdmVyIHRoZSB2bWRzCi0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSAoU3RyaW5nQnVmZmVyKV92bWRCdWZmZXIuZ2V0KHZtZCk7Ci0JCQkJU3RyaW5nIHRlc3RjYXNlVGVtcGxhdGUgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChfVEVTVENBU0VfVEVNUExBVEVfLCBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCksIGJ1ZmZlci50b1N0cmluZygpfSk7Ci0JCQkJCi0JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdGNhc2VUZW1wbGF0ZSk7Ci0JCQkJCi0JCQkJYnVmZmVyLmRlbGV0ZSgwLCBidWZmZXIubGVuZ3RoKCkpOyAvLyBjbGVhciB0aGUgYnVmZmVyIGZvciB0aGUgbmV4dCBwcm9qZWN0Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZ2V0QnVmZmVyKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gKFN0cmluZ0J1ZmZlcilfdm1kQnVmZmVyLmdldCh2bWQpOwotCQlpZihidWZmZXIgPT0gbnVsbCkgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJX3ZtZEJ1ZmZlci5wdXQodm1kLCBidWZmZXIpOwotCQl9Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svQnVpbGRJbmZvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svQnVpbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NmQyOWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL0J1aWxkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrOwotcHVibGljIGNsYXNzIEJ1aWxkSW5mbyB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICJMaWNlbnNlZCBNYXRlcmlhbHMgLS0gUHJvcGVydHkgb2YgSUJNXG4oYykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIDIwMDEsMjAwM1xuVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ0J1aWxkTGV2ZWwgPSAiMjAwMzExMTJfMTkxNS1XQjIxMi1BRC1WNTExRC1XNSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTQUJ1aWxkTGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9UZXN0T3BDb25zdHJCdWlsZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVGVzdE9wQ29uc3RyQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODI1MGEyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9UZXN0T3BDb25zdHJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVGVzdE9wQ29uc3RyQnVpbGRlciBleHRlbmRzIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERVJfSUQgPSAib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2suYnZ0YnVpbGRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElSZXNvdXJjZURlbHRhIF9kZWx0YSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgVGVzdE9wQ29uc3RyQnVpbGRlciBfaW5zdCA9IG51bGw7Ci0JCi0JcHVibGljIFRlc3RPcENvbnN0ckJ1aWxkZXIoKSB7Ci0JCV9pbnN0ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuZXZlbnRzLkludGVybmFsQnVpbGRlciNidWlsZChpbnQsIGphdmEudXRpbC5NYXAsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdFtdIGJ1aWxkKGludCBraW5kLCBNYXAgYXJncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGhpbmcgdG8gZG87IHRoaXMgY2xhc3MgZXhpc3RzIG9ubHkgc28gdGhhdCBhbiBJUmVzb3VyY2VEZWx0YSBjYW4gYmUgY29uc3RydWN0ZWQuCi0JCV9kZWx0YSA9IGdldERlbHRhKGdldFByb2plY3QoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2VEZWx0YSBnZXREZWx0YSgpIHsKLQkJcmV0dXJuIF9kZWx0YTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0T3BDb25zdHJCdWlsZGVyIHNpbmdsZXRvbigpIHsKLQkJcmV0dXJuIF9pbnN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9UZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1Rlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNzY3YjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1Rlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3azsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkpEVFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb25zdHJ1Y3RzIHRoZSBpbnB1dCBmb3IgdGhlIFRlc3RPcENvbnN0ck9wZXJhdGlvbi4gQmVjYXVzZQotICogVGVzdE9wQ29uc3RyT3BlcmF0aW9uIGlzIG5vdCBpbnZva2VkIGFzIHBhcnQgb2YgYSBidWlsZCwgd2hlbiBpdHMgSVJlc291cmNlcwotICogYXJlIHRvdWNoZWQsIGEgYnVpbGQgaXMgaW52b2tlZCBhZnRlciBlYWNoIHRvdWNoLCBhbmQgdGhhdCBtZWFucyB0aGF0IHRoZQotICogSVJlc291cmNlRGVsdGEgdGhhdCdzIGNvbnN0cnVjdGVkIGhhcyBvbmx5IG9uZSBJUmVzb3VyY2UgaW4gaXQgaW5zdGVhZAotICogb2YgdGhlIGdyb3VwIG9mIGNoYW5nZWQgSVJlc291cmNlIGluc3RhbmNlcy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGV0tfTk9CVUlMRF9URVNUX1ZBTElEQVRPUl9DTEFTUyA9ICJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuRndrTm9CdWlsZFRlc3RWYWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRldLX1RFU1RfVkFMSURBVE9SX0NMQVNTID0gIm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvci5Gd2tUZXN0VmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfVkFMSURBVE9SX0NMQVNTID0gIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnNhbXBsZS5Qcm9wZXJ0aWVzVmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgSVByb2plY3QgX3Byb2plY3QgPSBudWxsOwotCXByaXZhdGUgSUJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBJQ29tbWFuZCBfYnVpbGRlckNvbW1hbmQgPSBudWxsOwotCQotCXByaXZhdGUgSVJlc291cmNlRGVsdGEgX2NoYW5nZWREZWx0YSA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VEZWx0YSBfZW1wdHlEZWx0YSA9IG51bGw7Ci0JcHJpdmF0ZSBKYXZhSGVscGVyc1tdIF9jaGFuZ2VkQ2xhc3NlcyA9IG51bGw7Ci0JCi0JLyoqCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKi8KLQlwdWJsaWMgVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24oSUJ1ZmZlciBidWZmZXIsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJc2V0QnVmZmVyKGJ1ZmZlcik7Ci0JfQotCi0JcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYikgewotCQlfYnVmZmVyID0gYjsKLQl9Ci0JCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX3Byb2plY3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcCkgewotCQlfcHJvamVjdCA9IHA7Ci0JfQotCi0JLypwYWNrYWdlKi8gc3RhdGljIHZvaWQgZGVidWcoZmluYWwgSUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0aXRsZSwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJdHJ5IHsKLQkJCWJ1ZmZlci53cml0ZSh0aXRsZSk7Ci0JCQlkZWx0YS5hY2NlcHQobmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBzdWJkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlpZiAoc3ViZGVsdGEgPT0gbnVsbCkKLQkJCQkJCXJldHVybiB0cnVlOwotCi0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHN1YmRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCWJ1ZmZlci53cml0ZSgicmVzb3VyY2UgaXM6ICIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gdmlzaXQgdGhlIHN1YmRlbHRhJ3MgY2hpbGRyZW4KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIElSZXNvdXJjZSB0aGF0IGlzIG5vdCB2YWxpZGF0ZWQgYnkgdGhlIEZ3ayBUZXN0IFZhbGlkYXRvciAodGhpcwotCSAqIHJlc291cmNlIGlzIHVzZWQgZm9yIHRoZSBjYXNlIHdoZXJlIGEgcmVzb3VyY2UgaXMgY2hhbmdlZCwgYW5kIGEgYnVpbGQKLQkgKiBpcyBpbnZva2VkLCBidXQgdGhlIEZ3ayBUZXN0IHZhbGlkYXRvciBkb2VzIG5vdCB2YWxpZGF0ZSB0aGF0IHJlc291cmNlIGFuZAotCSAqIHNob3VsZCBub3QgYmUgbGF1bmNoZWQuKQotCSAqLwkKLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZVtdIGdldEVtcHR5UmVzb3VyY2VzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbXXsKLQkJCXByb2plY3QuZ2V0RmlsZSgiLmNsYXNzcGF0aCIpLCAvLyROT04tTkxTLTEkCi0JCX07Ci0JCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdG91Y2goSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcykgewotCQlmb3IoaW50IGk9MDsgaTxjaGFuZ2VkUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUmVzb3VyY2UgcmVzID0gY2hhbmdlZFJlc291cmNlc1tpXTsKLQkJCXRyeSB7Ci0JCQkJcmVzLnRvdWNoKG51bGwpOyAvLyBudWxsIElQcm9ncmVzc01vbml0b3IKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gT2ggd2VsbC4uLmRpcnR5IHRoZSBuZXh0IGZpbGUuCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJUmVzb3VyY2VEZWx0YSBnZXREZWx0YShJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCXRyeSB7Ci0JCQl0b3VjaChwcm9qZWN0LCBjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgVGVzdE9wQ29uc3RyQnVpbGRlci5CVUlMREVSX0lELCBfYnVpbGRlckNvbW1hbmQuZ2V0QXJndW1lbnRzKCksIG51bGwpOyAvLyBudWxsIElQcm9ncmVzc01vbml0b3IKLQkJCXJldHVybiBUZXN0T3BDb25zdHJCdWlsZGVyLnNpbmdsZXRvbigpLmdldERlbHRhKCk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRCdWlsZGVyKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZG9BZGQpIHsKLQkJaWYoZG9BZGQpIHsKLQkJCS8vIEFkZCB0aGUgYnVpbGRlciB0byB0aGUgcHJvamVjdAotCQkJdHJ5IHsKLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCUlDb21tYW5kW10gb2xkQ29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJCQlJQ29tbWFuZFtdIG5ld0NvbW1hbmRzID0gbmV3IElDb21tYW5kW29sZENvbW1hbmRzLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQ29tbWFuZHMsIDAsIG5ld0NvbW1hbmRzLCAwLCBvbGRDb21tYW5kcy5sZW5ndGgpOwotCQkJCV9idWlsZGVyQ29tbWFuZCA9IGRlc2NyaXB0aW9uLm5ld0NvbW1hbmQoKTsKLQkJCQlfYnVpbGRlckNvbW1hbmQuc2V0QnVpbGRlck5hbWUoVGVzdE9wQ29uc3RyQnVpbGRlci5CVUlMREVSX0lEKTsKLQkJCQluZXdDb21tYW5kc1tvbGRDb21tYW5kcy5sZW5ndGhdID0gX2J1aWxkZXJDb21tYW5kOwotCQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7Ci0KLQkJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBSZW1vdmUgdGhlIGJ1aWxkZXIKLQkJCXRyeSB7Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlJQ29tbWFuZFtdIG9sZENvbW1hbmRzID0gZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCk7Ci0JCQkJSUNvbW1hbmRbXSBuZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFtvbGRDb21tYW5kcy5sZW5ndGggLSAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZENvbW1hbmRzLCAwLCBuZXdDb21tYW5kcywgMCwgbmV3Q29tbWFuZHMubGVuZ3RoKTsKLQkJCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3Q29tbWFuZHMpOwotCQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWFkZEJ1aWxkZXIoZ2V0UHJvamVjdCgpLCB0cnVlKTsKLQkJCQotCQkJLy8gRmlyc3QsIGJ1aWxkIHRoZSBwcm9qZWN0IHNvIHRoYXQgdGhlIHN1YnNlcXVlbnQgYnVpbGRzIGFyZW4ndCBzdGFydGVkIHdpdGggYSBudWxsIGRlbHRhLgotCQkJZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIFRlc3RPcENvbnN0ckJ1aWxkZXIuQlVJTERFUl9JRCwgX2J1aWxkZXJDb21tYW5kLmdldEFyZ3VtZW50cygpLCBudWxsKTsgLy8gbnVsbCBJUHJvZ3Jlc3NNb25pdG9yCi0JCQkKLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gdG1kcyA9IEpEVFV0aWxpdHkuZ2V0VkZUZXN0cyhtb25pdG9yLCBnZXRQcm9qZWN0KCkpOwotCQkJaWYoKHRtZHMgPT0gbnVsbCkgfHwgKHRtZHMubGVuZ3RoID09IDApKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBUaGVuIGNhbGN1bGF0ZSB0aGUgZGVsdGFzCi0JCQlJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzID0gZ2V0Q2hhbmdlZFJlc291cmNlcyhnZXRQcm9qZWN0KCksIHRtZHMpOwotCQkJX2VtcHR5RGVsdGEgPSBnZXREZWx0YShnZXRQcm9qZWN0KCksIGdldEVtcHR5UmVzb3VyY2VzKGdldFByb2plY3QoKSkpOwotCQkJX2NoYW5nZWREZWx0YSA9IGdldERlbHRhKGdldFByb2plY3QoKSwgY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkKLQkJCS8vIFRoZW4gcmVzdG9yZSB0aGUgcHJvamVjdCdzIGJ1aWxkIGNvbW1hbmRzIGJhY2sgdG8gd2hhdCB0aGV5IHdlcmUuCi0JCQlhZGRCdWlsZGVyKGdldFByb2plY3QoKSwgZmFsc2UpOwotCi0JCQlfY2hhbmdlZENsYXNzZXMgPSBnZXRDaGFuZ2VkQ2xhc3NlcyhjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJfQotCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSVJlc291cmNlRGVsdGEgZ2V0Q2hhbmdlZERlbHRhKCkgewotCQlyZXR1cm4gX2NoYW5nZWREZWx0YTsKLQl9Ci0JCi0JcHVibGljIElSZXNvdXJjZURlbHRhIGdldEVtcHR5RGVsdGEoKSB7Ci0JCXJldHVybiBfZW1wdHlEZWx0YTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2VbXSBnZXRDaGFuZ2VkUmVzb3VyY2VzKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRvclRlc3RjYXNlW10gdG1kcykgewotCQlTZXQgdGVtcCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvcihpbnQgaT0wOyBpPHRtZHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIHRtZCA9IHRtZHNbaV07Ci0JCQlJUmVzb3VyY2VbXSByZXMgPSB0bWQuZ2V0UmVzb3VyY2VzKHByb2plY3QpOwotCQkJZm9yKGludCBqPTA7IGo8cmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJdGVtcC5hZGQocmVzW2pdKTsKLQkJCX0KLQkJfQotCQlJUmVzb3VyY2VbXSByZXN1bHQgPSBuZXcgSVJlc291cmNlW3RlbXAuc2l6ZSgpXTsKLQkJdGVtcC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBKYXZhSGVscGVyc1tdIGdldENoYW5nZWRDbGFzc2VzKElSZXNvdXJjZVtdIHJlc291cmNlcykgewotCQlpZihfY2hhbmdlZENsYXNzZXMgPT0gbnVsbCkgewotCQkJaWYocmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IEphdmFIZWxwZXJzWzBdOwotCQkJfQotCQkJCi0JCQlKYXZhSGVscGVyc1tdIHJlc3VsdCA9IG5ldyBKYXZhSGVscGVyc1tyZXNvdXJjZXMubGVuZ3RoXTsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlmb3IoaW50IGk9MDsgaTxyZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JCQkJaWYoKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpICYmIChyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJqYXZhIikgfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygiY2xhc3MiKSkpIHsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCQlKYXZhSGVscGVycyBoID0gSkRUVXRpbGl0eS5nZXRKYXZhSGVscGVycygoSUZpbGUpcmVzb3VyY2UpOwotCQkJCQlpZihoICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdFtjb3VudCsrXSA9IGg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKGNvdW50ICE9IHJlc291cmNlcy5sZW5ndGgpIHsKLQkJCQlKYXZhSGVscGVyc1tdIHRlbXAgPSBuZXcgSmF2YUhlbHBlcnNbY291bnRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCB0ZW1wLCAwLCBjb3VudCk7Ci0JCQkJcmV0dXJuIHRlbXA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBfY2hhbmdlZENsYXNzZXM7Ci0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVGVzdE9wQ29uc3RyT3BlcmF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVGVzdE9wQ29uc3RyT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ODE4YzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1Rlc3RPcENvbnN0ck9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3azsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5JT3BlcmF0aW9uUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5WYWxpZGF0aW9uVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkpEVFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5HbG9iYWxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkludGVybmFsVmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BbGxWYWxpZGF0b3JzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVJ1bGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLk9uZVZhbGlkYXRvck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JTdWJzZXRPcGVyYXRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyB0ZXN0cyBldmVyeSBjb25zdHJ1Y3RvciBhdmFpbGFibGUgaW4gdGhlIFZhbGlkYXRpb25PcGVyYXRpb24KLSAqIGhpZXJhcmNoeSBhbmQgZW5zdXJlcyB0aGF0IGFuIG9wZXJhdGlvbiwgY3JlYXRlZCB3aXRoIHRoYXQgY29uc3RydWN0b3IsIAotICogcmVzdWx0cyBpbiB0aGUgZXhwZWN0ZWQgdmFsaWRhdGlvbiBJTWFya2Vycy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RPcENvbnN0ck9wZXJhdGlvbiBpbXBsZW1lbnRzIElPcGVyYXRpb25SdW5uYWJsZSB7Ci0JcHJpdmF0ZSBJUHJvamVjdCBfcHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBJQnVmZmVyIF9idWZmZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF90ZXN0Q2FzZU5hbWUgPSBudWxsOwotCQotCS8qKgotCSAqIE11c3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yIGluIG9yZGVyIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24uCi0JICogTVVTVCBjYWxsIHNldEJ1ZmZlciwgc2V0UHJvamVjdCwgYW5kIHNldE5hbWUgYmVmb3JlIHVzaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIFRlc3RPcENvbnN0ck9wZXJhdGlvbigpIHsKLQl9Ci0JCi0JLyoqCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKi8KLQlwdWJsaWMgVGVzdE9wQ29uc3RyT3BlcmF0aW9uKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdGVzdENhc2VOYW1lKSB7Ci0JCXNldEJ1ZmZlcihidWZmZXIpOwotCQlzZXRQcm9qZWN0KHByb2plY3QpOwotCQlzZXROYW1lKHRlc3RDYXNlTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJcmV0dXJuIF9idWZmZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGIpIHsKLQkJX2J1ZmZlciA9IGI7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX3Byb2plY3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcCkgewotCQlfcHJvamVjdCA9IHA7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIF90ZXN0Q2FzZU5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJX3Rlc3RDYXNlTmFtZSA9IG5hbWU7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUdsb2JhbENvbmZpZ3VyYXRpb24gZ2NvbmYgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBvcmlnR2NvbmYgPSBuZXcgR2xvYmFsQ29uZmlndXJhdGlvbihnY29uZik7Ci0JCQlib29sZWFuIGF1dG9CdWlsZEVuYWJsZWQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKTsKLQkJCXRyeSB7Ci0JCQkJLy8gSW4gb3JkZXIgZm9yIHRoZSBvcGVyYXRpb25zIHRvIHdvcmsgY29ycmVjdGx5LCBzZXQgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyB0bwotCQkJCS8vIHRoZSB2YWxpZGF0b3JzIGZvciB3aGljaCB0ZXN0cyBleGlzdCwgYW5kIHR1cm4gb2ZmIGF1dG8tYnVpbGQgc28gdGhhdCBhCi0JCQkJLy8gdmFsaWRhdGlvbiBpcyBmb3JjZWQuCi0JCQkJZ2NvbmYuc2V0Q2FuUHJvamVjdHNPdmVycmlkZShmYWxzZSk7Ci0JCQkJLy9nY29uZi5zZXRBdXRvVmFsaWRhdGUoZmFsc2UpOwotCQkJCS8vZ2NvbmYuc2V0QXV0b1ZhbGlkYXRlKHRydWUpOwotCQkJCS8vZ2NvbmYuc2V0QnVpbGRWYWxpZGF0ZSh0cnVlKTsKLQkJCQkvL2djb25mLnNldE1heGltdW1OdW1iZXJPZk1lc3NhZ2VzKFdvcmtiZW5jaFJlcG9ydGVyLk5PX01FU1NBR0VfTElNSVQpOwotCQkJCWdjb25mLnBhc3NpdmF0ZSgpOwotCQkJCQotCQkJCUpEVFV0aWxpdHkuc2V0QXV0b0J1aWxkKGZhbHNlKTsKLQkJCQkKLQkJCQltb25pdG9yLnN1YlRhc2soIkxvYWRpbmcgb3BlcmF0aW9uczsgcGxlYXNlIHdhaXQuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCVRlc3RXcmFwcGVyW10gdGVzdENhc2VBbmRPcGVyYXRpb25zID0gZ2V0T3BlcmF0aW9ucyhtb25pdG9yLCBnY29uZik7Ci0JCQkJaWYodGVzdENhc2VBbmRPcGVyYXRpb25zID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiVGVzdCBjYXNlIGZhaWxlZDsgY2Fubm90IHRlc3QgbnVsbCBvcGVyYXRpb25zLiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUobWVzc2FnZSk7Ci0JCQkJCW1vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkKLQkJCQlpbnQgbnVtUGFzc2VkID0gMDsKLQkJCQlmb3IoaW50IGk9MDsgaTx0ZXN0Q2FzZUFuZE9wZXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJVGVzdFdyYXBwZXIgdGVzdFdyYXBwZXIgPSB0ZXN0Q2FzZUFuZE9wZXJhdGlvbnNbaV07Ci0JCQkJCVZhbGlkYXRpb25PcGVyYXRpb24gb3BlcmF0aW9uID0gdGVzdFdyYXBwZXIuZ2V0T3BlcmF0aW9uKCk7Ci0JCQkJCWJvb2xlYW4gdHBhc3NlZCA9IGZhbHNlOwotCQkJCQl0cnkgewotCQkJCQkJaWYobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCW1vbml0b3Iuc3ViVGFzaygiVGVzdGluZyAiICsgKGkrMSkgKyAiIG9mICIgKyB0ZXN0Q2FzZUFuZE9wZXJhdGlvbnMubGVuZ3RoICsgIiBjb25zdHJ1Y3RvcnMuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlwcmVUZXN0KHRlc3RXcmFwcGVyKTsKLQkJCQkJCWlmKHRlc3QobW9uaXRvciwgdGVzdFdyYXBwZXIpKSB7Ci0JCQkJCQkJbnVtUGFzc2VkKys7Ci0JCQkJCQkJdHBhc3NlZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUoIlRocm93YWJsZSBjYXVnaHQgd2hpbGUgdGVzdGluZyAjIiArIChpKzEpICsgIiAiICsgb3BlcmF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gIlRlc3QgIyIgKyAoaSsxKSArICIgb2YgIiArIHRlc3RDYXNlQW5kT3BlcmF0aW9ucy5sZW5ndGggKyAoKHRwYXNzZWQpID8gIiBwYXNzZWQuIiA6ICIgZmFpbGVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJCQltb25pdG9yLnN1YlRhc2sobWVzc2FnZSk7Ci0JCQkJCQlnZXRCdWZmZXIoKS53cml0ZShtZXNzYWdlKTsKLQkJCQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksIHRlc3RXcmFwcGVyLmdldE5hbWUoKSwgdHBhc3NlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlTdHJpbmcgc3RhdHVzID0gbnVtUGFzc2VkICsgIiBvZiAiICsgdGVzdENhc2VBbmRPcGVyYXRpb25zLmxlbmd0aCArICIgdGVzdHMgcGFzc2VkLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW1vbml0b3Iuc3ViVGFzayhzdGF0dXMpOwotCQkJCWdldEJ1ZmZlcigpLndyaXRlKHN0YXR1cyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBTZXQgdGhlIHByb2plY3QncyBzZXR0aW5ncyBiYWNrIHRvIHdoYXQgdGhleSB3ZXJlLgotCQkJCWdjb25mID0gb3JpZ0djb25mOwotCQkJCWdjb25mLnBhc3NpdmF0ZSgpOwotCQkJCQotCQkJCUpEVFV0aWxpdHkuc2V0QXV0b0J1aWxkKGF1dG9CdWlsZEVuYWJsZWQpOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJlVGVzdChUZXN0V3JhcHBlciB3cmFwcGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEZpcnN0LCByZW1vdmUgYWxsIG9mIHRoZSBtYXJrZXJzLiBDYW4ndCByZWx5IG9uIHRoZSBvcGVyYXRpb24gdG8gcmVtb3ZlIHRoZSBtYXJrZXJzIGJldHdlZW4KLQkJLy8gb25lIGludm9jYXRpb24gYW5kIHRoZSBuZXh0IGJlY2F1c2Ugc29tZXRpbWVzIHRoZSB2YWxpZGF0aW9uIGlzIG5vdCBzdXBwb3NlZCB0byBydW4uCi0JCVRhc2tMaXN0VXRpbGl0eS5yZW1vdmVBbGxUYXNrcyhnZXRQcm9qZWN0KCksIHdyYXBwZXIuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7IC8vIG51bGw9ZGVsZXRlIG1hcmtlcnMgb24gYWxsIG9iamVjdHMKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHRlc3QgcGFzc2VzLCBhbmQgZmFsc2UgaWYgaXQgZmFpbGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB0ZXN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVGVzdFdyYXBwZXIgdGVzdFdyYXBwZXIpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQl0cnkgewotCQkJcmVzdWx0ID0gQlZUUnVubmVyLnNpbmdsZXRvbigpLnRlc3QoZ2V0QnVmZmVyKCksIGdldE5hbWUoKSwgdGVzdFdyYXBwZXIuZ2V0TmFtZSgpLCB0ZXN0V3JhcHBlci5nZXRFeHBlY3RlZE1lc3NhZ2VzKCksIHRlc3RXcmFwcGVyLmdldE9wZXJhdGlvbigpLCB0ZXN0V3JhcHBlci5nZXRWYWxpZGF0b3JOYW1lcygpKSAmJiByZXN1bHQ7Ci0JCX0KLQkJY2F0Y2goQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGV4Yy5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSwgd2l0aCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGFycmF5IHRoZSBWYWxpZGF0b3JUZXN0Y2FzZSB0aGF0IAotCSAqIGhvbGRzIHRoZSBleHBlY3RlZCByZXN1bHRzLCBhbmQgdGhlIHNlY29uZCBlbnRyeSBvZiB0aGUgYXJyYXkgYSBWYWxpZGF0aW9uT3BlcmF0aW9uW10KLQkgKiBjb250YWluaW5nIHRoZSBvcGVyYXRpb25zIHRvIGJlIHRlc3RlZC4KLQkgKi8KLQlwcml2YXRlIFRlc3RXcmFwcGVyW10gZ2V0T3BlcmF0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVZhbGlkYXRvclRlc3RjYXNlW10gYWxsVG1kcyA9IEpEVFV0aWxpdHkuZ2V0VkZUZXN0cyhtb25pdG9yLCBnZXRQcm9qZWN0KCkpOwotCQlpZigoYWxsVG1kcyA9PSBudWxsKSB8fCAoYWxsVG1kcy5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gU29tZSBvZiB0aGUgb3BlcmF0aW9uIGNvbnN0cnVjdG9ycyByZXF1aXJlIGZpbGUgZXh0ZW5zaW9ucy4gCi0JCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZGVmYXVsdEV4dGVuc2lvbiA9IG51bGw7Ci0JCUlGaWxlIGphdmFGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoImZvby5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBTb21lIG9mIHRoZSBvcGVyYXRpb25zIGJlbG93IHBhc3MgaWYgdGhleSBkb24ndCBwcm9kdWNlIGFueSByZXN1bHRzLgotCQkvLyBDcmVhdGUgYSB0ZXN0IGNhc2UgdGhhdCBwYXNzZXMgdGhlIG9wZXJhdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGRvZXMgbm90aGluZy4KLQkJTGlzdCB0bWRFbXB0eSA9IG5ldyBBcnJheUxpc3QoKTsgLy8gZXhwZWN0ZWQgbWVzc2FnZXMgPT0gbm9uZQotCQlMaXN0IHRtZEluYyA9IG5ldyBBcnJheUxpc3QoKTsgLy8gZXhwZWN0ZWQgbWVzc2FnZXMgd2hlbiBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzIHJhbgotCQlMaXN0IHRtZEVuYWJsZWQgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIGV4cGVjdGVkIG1lc3NhZ2VzIHdoZW4gZW5hYmxlZCB2YWxpZGF0b3JzIHJhbgotCQlMaXN0IHRtZEphdmEgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIGV4cGVjdGVkIG1lc3NhZ2VzIHdoZW4gdmFsaWRhdG9ycyB0aGF0IHZhbGlkYXRlIC5qYXZhIGZpbGVzIGFyZSBydW4KLQkJTGlzdCB0bWRGdWxsID0gbmV3IEFycmF5TGlzdCgpOyAvLyBleHBlY3RlZCBtZXNzYWdlcyB3aGVuIHZhbGlkYXRvcnMgdGhhdCBzdXBwb3J0IG9ubHkgIlJ1biBWYWxpZGF0aW9uIiBhcmUgcnVuCi0JCVNldCBlbmFibGVkVmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0KCk7IC8vIGVuYWJsZWQgdmFsaWRhdG9ycyA9PSBGV0sgVmFsLCBGV0sgTm9CdWlsZCBWYWwsIFByb3BlcnRpZXMgVmFsCi0JCVNldCBlbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQoKTsgLy8gZW5hYmxlZCBpbmNyZW1lbnRhbCA9PSBGV0sgVmFsLCBQcm9wZXJ0aWVzIFZhbCAoc3VwcG9ydCBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uKQotCQlTZXQgamF2YVZhbGlkYXRvcnMgPSBuZXcgSGFzaFNldCgpOyAvLyBqYXZhIHZhbCA9PSBGV0sgVmFsLCBGV0sgTm9CdWlsZCBWYWwgKHZhbGlkYXRlIC5qYXZhIGZpbGVzKQotCQlTZXQgZnVsbFZhbGlkYXRvcnMgPSBuZXcgSGFzaFNldCgpOyAvLyBmdWxsIHZhbCA9PSBGV0sgTm9CdWlsZCBWYWwgKHJ1bnMgb25seSB3aGVuICJSdW4gVmFsaWRhdGlvbiIgY2xpY2tlZCkKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSBlbmFibGVkVm1kID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2FsbFRtZHMubGVuZ3RoXTsKLQkJZm9yKGludCBpPTA7IGk8YWxsVG1kcy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yVGVzdGNhc2UgdnQgPSBhbGxUbWRzW2ldOwotCQkJCi0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2dC5nZXRWYWxpZGF0b3JNZXRhRGF0YSgpOwotCQkJZW5hYmxlZFZhbGlkYXRvcnMuYWRkKHZtZCk7Ci0JCQllbmFibGVkVm1kW2ldID0gdm1kOwotCQkJaWYodm1kLmlzSW5jcmVtZW50YWwoKSkgewotCQkJCWVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMuYWRkKHZtZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmdWxsVmFsaWRhdG9ycy5hZGQodm1kKTsKLQkJCQl0bWRGdWxsLmFkZEFsbCh2dC5nZXRNZXNzYWdlcyhWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pKTsKLQkJCX0KLQkJCQotCQkJLy8gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjb2RlIHRoYXQgaW5zdGFudGlhdGVzIHRoZSBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24KLQkJCS8vIHRvIGVuc3VyZSB0aGF0IHdoZW4gYW4gYXJyYXkgb2YgY2hhbmdlZCByZXNvdXJjZXMgb3Igb2JqZWN0cyBpcyBwYXNzZWQgdG8gdGhlIG9wZXJhdGlvbiwKLQkJCS8vIHRoYXQgb25seSBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzIGFyZSBpbnZva2VkIGJ5IHRoZSBvcGVyYXRpb24uIFRoZSBmcmFtZXdvcmsgZG9lcyBub3QKLQkJCS8vIGNoZWNrIGlmIHRoZSB2YWxpZGF0b3JzIGFyZSBpbmNyZW1lbnRhbCBvciBub3Q7IGluc3RlYWQsIHRoZSBuYW1lZCB2YWxpZGF0b3JzIHdpbGwgcnVuLAotCQkJLy8gZXZlbiBpZiB0aGV5IHBlcmZvcm0gYSBmdWxsIHZhbGlkYXRpb24gaW5zdGVhZCBvZiB2YWxpZGF0aW5nIGp1c3QgdGhlIGFycmF5cy4KLQkJCWlmKHZtZC5pc0FwcGxpY2FibGVUbyhqYXZhRmlsZSkgJiYgdm1kLmlzSW5jcmVtZW50YWwoKSkgewotCQkJCWphdmFWYWxpZGF0b3JzLmFkZCh2bWQpOwotCQkJCXRtZEphdmEuYWRkQWxsKHZ0LmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OKSk7Ci0JCQl9Ci0JCQkKLQkJCXRtZEVuYWJsZWQuYWRkQWxsKHZ0LmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTikpOwotCQkJdG1kSW5jLmFkZEFsbCh2dC5nZXRNZXNzYWdlcyhWYWxpZGF0aW9uVHlwZUVudW0uSU5DUkVNRU5UQUxfVkFMSURBVElPTikpOwkJCQotCQl9Ci0JCVN0cmluZ1tdIGFsbFZhbGlkYXRvck5hbWVzID0gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3JOYW1lcyhlbmFibGVkVmFsaWRhdG9ycyk7Ci0JCVN0cmluZ1tdIGluY1ZhbGlkYXRvck5hbWVzID0gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3JOYW1lcyhlbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKTsKLQkJU3RyaW5nW10gamF2YVZhbGlkYXRvck5hbWVzID0gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3JOYW1lcyhqYXZhVmFsaWRhdG9ycyk7Ci0JCVN0cmluZ1tdIGZ1bGxWYWxpZGF0b3JOYW1lcyA9IEludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yTmFtZXMoZnVsbFZhbGlkYXRvcnMpOwotCQkKLQkJdmNvbmYuc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFZtZCk7Ci0JCXZjb25mLnBhc3NpdmF0ZSgpOwotCQkKLQkJLy8gU3RhcnQgY29uc3RydWN0aW5nIHRoZSB0ZXN0cwotCQkvLyBGb3IgdGhlIHRlc3RzIHRoYXQgZGVwZW5kIG9uIHRoZSB2YWx1ZSBvZiB0aGUgYXV0b0J1aWxkIHNldHRpbmcsIGl0IGlzIGFzc3VtZWQgdGhhdAotCQkvLyBhdXRvQnVpbGQgaXMgb24uIFRoZSB0ZXN0cyB3aWxsIGZhaWwgaWYgYXV0b0J1aWxkIGlzIGRpc2FibGVkLgotCQkvLwotCQkvLyBVbmxpa2UgdGhlIHN1YnNlcXVlbnQgb3BlcmF0aW9ucywgdGhlc2UgZmlyc3QgdHdvIGNhbm5vdCB1c2UgdGhlIGFsbFRtZHMgVE1EIGJlY2F1c2UKLQkJLy8gbW9yZSB0aGFuIG9uZSB2YWxpZGF0b3IgcnVucy4gVGhlIGFsbFRtZEZ1bGwgVE1EIGNvbnRhaW5zIGFsbCB0bWQgb2YgdmFsaWRhdG9ycyB0aGF0Ci0JCS8vIHdpbGwgcnVuLiAKLQkJQWxsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDEgPSBuZXcgQWxsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCkpOwotCQlUZXN0V3JhcHBlciB0ZXN0MSA9IG5ldyBUZXN0V3JhcHBlcihvcDEsIHRtZEVuYWJsZWQsICJvcDEiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUFsbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyID0gbmV3IEFsbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmYWxzZSk7IC8vIGRvbid0IGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDIgPSBuZXcgVGVzdFdyYXBwZXIob3AyLCB0bWRFbmFibGVkLCAib3AyIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ29uc3RydWN0IHRoZSBpbnB1dCBmb3IgdGhlIHJlc3Qgb2YgdGhlIG9wZXJhdGlvbnMgdXNpbmcgdGhlIFZGIFRlc3QgdmFsaWRhdG9ycy4KLQkJVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24gaW5wdXRPcCA9IG5ldyBUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbihnZXRCdWZmZXIoKSwgZ2V0UHJvamVjdCgpKTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oaW5wdXRPcCwgbW9uaXRvcik7Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFRlc3RXcmFwcGVyWzBdOwotCQl9Ci0JCQotCQlJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzID0gVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uZ2V0Q2hhbmdlZFJlc291cmNlcyhnZXRQcm9qZWN0KCksIGFsbFRtZHMpOwotCQlJUmVzb3VyY2VbXSBlbXB0eVJlc291cmNlcyA9IFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLmdldEVtcHR5UmVzb3VyY2VzKGdldFByb2plY3QoKSk7Ci0JCUphdmFIZWxwZXJzW10gY2hhbmdlZENsYXNzZXMgPSBpbnB1dE9wLmdldENoYW5nZWRDbGFzc2VzKGNoYW5nZWRSZXNvdXJjZXMpOwotCQlJUmVzb3VyY2VEZWx0YSBlbXB0eURlbHRhID0gaW5wdXRPcC5nZXRFbXB0eURlbHRhKCk7Ci0JCUlSZXNvdXJjZURlbHRhIGNoYW5nZWREZWx0YSA9IGlucHV0T3AuZ2V0Q2hhbmdlZERlbHRhKCk7Ci0JCS8vIGVuZCBjb25zdHJ1Y3QgaW5wdXQKLQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMyA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgbnVsbCx0cnVlKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDMgPSBuZXcgVGVzdFdyYXBwZXIob3AzLCB0bWRJbmMsICJvcDMiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3A0ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsZmFsc2UpOwotCQlUZXN0V3JhcHBlciB0ZXN0NCA9IG5ldyBUZXN0V3JhcHBlcihvcDQsIHRtZEluYywgIm9wNCIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDUgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsZmFsc2UpOwotCQlUZXN0V3JhcHBlciB0ZXN0NSA9IG5ldyBUZXN0V3JhcHBlcihvcDUsIHRtZEVtcHR5LCAib3A1IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wNiA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgbnVsbCwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOwotCQlUZXN0V3JhcHBlciB0ZXN0NiA9IG5ldyBUZXN0V3JhcHBlcihvcDYsIHRtZEluYywgIm9wNiIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDcgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOwotCQlUZXN0V3JhcHBlciB0ZXN0NyA9IG5ldyBUZXN0V3JhcHBlcihvcDcsIHRtZEluYywgIm9wNyIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDggPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULGZhbHNlKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDggPSBuZXcgVGVzdFdyYXBwZXIob3A4LCB0bWRFbXB0eSwgIm9wOCIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDkgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMsIG51bGwsIElSdWxlR3JvdXAuUEFTU19GQVNUKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDkgPSBuZXcgVGVzdFdyYXBwZXIob3A5LCB0bWRJbmMsICJvcDkiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxMCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycywgY2hhbmdlZERlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QxMCA9IG5ldyBUZXN0V3JhcHBlcihvcDEwLCB0bWRJbmMsICJvcDEwIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMTEgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMsIGVtcHR5RGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNUKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDExID0gbmV3IFRlc3RXcmFwcGVyKG9wMTEsIHRtZEVtcHR5LCAib3AxMSIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDEyID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLCBmYWxzZSk7IC8vIGZ1bGwgdmFsaWRhdGUsIGRvbid0IGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDEyID0gbmV3IFRlc3RXcmFwcGVyKG9wMTIsIHRtZEluYywgIm9wMTIiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxMyA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLCBmYWxzZSk7IC8vIGRlbHRhIHZhbGlkYXRlLCBkb24ndCBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QxMyA9IG5ldyBUZXN0V3JhcHBlcihvcDEzLCB0bWRJbmMsICJvcDEzIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMTQgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsIGZhbHNlKTsgLy8gZW1wdHkgZGVsdGEgdmFsaWRhdGUsIGRvbid0IGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDE0ID0gbmV3IFRlc3RXcmFwcGVyKG9wMTQsIHRtZEVtcHR5LCAib3AxNCIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDE1ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgZmFsc2UpOyAvLyBmdWxsIHZhbGlkYXRlLCBkb24ndCBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QxNSA9IG5ldyBUZXN0V3JhcHBlcihvcDE1LCB0bWRJbmMsICJvcDE1IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMTYgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlKTsgLy8gZGVsdGEgdmFsaWRhdGUsIGRvbid0IGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDE2ID0gbmV3IFRlc3RXcmFwcGVyKG9wMTYsIHRtZEluYywgIm9wMTYiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxNyA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlKTsgLy8gZW1wdHkgZGVsdGEgdmFsaWRhdGUsIGRvbid0IGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDE3ID0gbmV3IFRlc3RXcmFwcGVyKG9wMTcsIHRtZEVtcHR5LCAib3AxNyIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxOCA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCkpOwotCQlUZXN0V3JhcHBlciB0ZXN0MTg9IG5ldyBUZXN0V3JhcHBlcihvcDE4LCB0bWRFbmFibGVkLCAib3AxOCIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxOSA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZhbHNlKTsgLy8gZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MTkgPSBuZXcgVGVzdFdyYXBwZXIob3AxOSwgdG1kRW5hYmxlZCwgIm9wMTkiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjAgPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QyMCA9IG5ldyBUZXN0V3JhcHBlcihvcDIwLCB0bWRFbmFibGVkLCAib3AyMCIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyMSA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIElSdWxlR3JvdXAuUEFTU19GQVNULCB0cnVlLGZhbHNlKTsgLy8gZm9yY2UgdmFsaWRhdGlvbiBpZiBpdCBkb2Vzbid0IG5lZWQgdG8gcnVuCi0JCVRlc3RXcmFwcGVyIHRlc3QyMSA9IG5ldyBUZXN0V3JhcHBlcihvcDIxLCB0bWRFbmFibGVkLCAib3AyMSIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyMiA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIElSdWxlR3JvdXAuUEFTU19GQVNULCBmYWxzZSxmYWxzZSk7IC8vIG5vIGZvcmNlIHZhbGlkYXRpb24gaWYgaXQgZG9lc24ndCBuZWVkIHRvIHJ1bgotCQlUZXN0V3JhcHBlciB0ZXN0MjIgPSBuZXcgVGVzdFdyYXBwZXIob3AyMiwgdG1kRW5hYmxlZCwgIm9wMjIiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjMgPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgdHJ1ZSwgZmFsc2UpOyAvLyBmb3JjZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MjMgPSBuZXcgVGVzdFdyYXBwZXIob3AyMywgdG1kRW5hYmxlZCwgIm9wMjMiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjQgPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgZmFsc2UsIGZhbHNlKTsgLy8gbm8gZm9yY2UsIGRvbid0IGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDI0ID0gbmV3IFRlc3RXcmFwcGVyKG9wMjQsIHRtZEVuYWJsZWQsICJvcDI0IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDI1ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLHRydWUpOyAKLQkJVGVzdFdyYXBwZXIgdGVzdDI1ID0gbmV3IFRlc3RXcmFwcGVyKG9wMjUsIHRtZEVuYWJsZWQsICJvcDI1IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDI2ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsdHJ1ZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QyNiA9IG5ldyBUZXN0V3JhcHBlcihvcDI2LCB0bWRJbmMsICJvcDI2IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDI3ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLHRydWUpOwotCQlUZXN0V3JhcHBlciB0ZXN0MjcgPSBuZXcgVGVzdFdyYXBwZXIob3AyNywgdG1kRW1wdHksICJvcDI3IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDI4ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCx0cnVlKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDI4ID0gbmV3IFRlc3RXcmFwcGVyKG9wMjgsIHRtZEVuYWJsZWQsICJvcDI4IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDI5ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULHRydWUpOwotCQlUZXN0V3JhcHBlciB0ZXN0MjkgPSBuZXcgVGVzdFdyYXBwZXIob3AyOSwgdG1kSW5jLCAib3AyOSIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AzMCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsdHJ1ZSk7IAotCQlUZXN0V3JhcHBlciB0ZXN0MzAgPSBuZXcgVGVzdFdyYXBwZXIob3AzMCwgdG1kRW1wdHksICJvcDMwIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gYWxsVG1kc1swXS5nZXRWYWxpZGF0b3JNZXRhRGF0YSgpOwotCQlTdHJpbmcgdmFsaWRhdG9yTmFtZSA9IHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0JCVN0cmluZ1tdIHZtZE5hbWVzID0gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3JOYW1lcyhuZXcgVmFsaWRhdG9yTWV0YURhdGFbXXt2bWR9KTsKLQkJTGlzdCBleHBlY3RlZE1lc3NhZ2VzID0gYWxsVG1kc1swXS5nZXRNZXNzYWdlcyhWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pOwotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AzMSA9IG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3JOYW1lKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDMxID0gbmV3IFRlc3RXcmFwcGVyKG9wMzEsIGV4cGVjdGVkTWVzc2FnZXMsICJvcDMxIiwgdm1kTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AzMiA9IG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3JOYW1lLCB0cnVlKTsgLy8gZm9yY2UgaWYgbmVjZXNzYXJ5Ci0JCVRlc3RXcmFwcGVyIHRlc3QzMiA9IG5ldyBUZXN0V3JhcHBlcihvcDMyLCBleHBlY3RlZE1lc3NhZ2VzLCAib3AzMiIsIHZtZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJT25lVmFsaWRhdG9yT3BlcmF0aW9uIG9wMzMgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZSwgZmFsc2UpOyAvLyBubyBmb3JjZQotCQlUZXN0V3JhcHBlciB0ZXN0MzMgPSBuZXcgVGVzdFdyYXBwZXIob3AzMywgZXhwZWN0ZWRNZXNzYWdlcywgIm9wMzMiLCB2bWROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDM0ID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUsIHRydWUsIGZhbHNlKTsgLy8gZm9yY2UsIG5vIGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDM0ID0gbmV3IFRlc3RXcmFwcGVyKG9wMzQsIGV4cGVjdGVkTWVzc2FnZXMsICJvcDM0Iiwgdm1kTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AzNSA9IG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3JOYW1lLCBmYWxzZSwgZmFsc2UpOyAvLyBubyBmb3JjZSwgbm8gZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MzUgPSBuZXcgVGVzdFdyYXBwZXIob3AzNSwgZXhwZWN0ZWRNZXNzYWdlcywgIm9wMzUiLCB2bWROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDM2ID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUsIHRydWUsIElSdWxlR3JvdXAuUEFTU19GQVNUKTsgLy8gZm9yY2UKLQkJVGVzdFdyYXBwZXIgdGVzdDM2ID0gbmV3IFRlc3RXcmFwcGVyKG9wMzYsIGV4cGVjdGVkTWVzc2FnZXMsICJvcDM2Iiwgdm1kTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AzNyA9IG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3JOYW1lLCBmYWxzZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QpOyAvLyBubyBmb3JjZQotCQlUZXN0V3JhcHBlciB0ZXN0MzcgPSBuZXcgVGVzdFdyYXBwZXIob3AzNywgZXhwZWN0ZWRNZXNzYWdlcywgIm9wMzciLCB2bWROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDM4ID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUsIHRydWUsIElSdWxlR3JvdXAuUEFTU19GQVNULCBmYWxzZSk7IC8vIGZvcmNlLCBubyBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QzOCA9IG5ldyBUZXN0V3JhcHBlcihvcDM4LCBleHBlY3RlZE1lc3NhZ2VzLCAib3AzOCIsIHZtZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJT25lVmFsaWRhdG9yT3BlcmF0aW9uIG9wMzkgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZSwgZmFsc2UsIElSdWxlR3JvdXAuUEFTU19GQVNULCBmYWxzZSk7IC8vIG5vIGZvcmNlLCBubyBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QzOSA9IG5ldyBUZXN0V3JhcHBlcihvcDM5LCBleHBlY3RlZE1lc3NhZ2VzLCAib3AzOSIsIHZtZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDQwID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksdHJ1ZSxmYWxzZSk7Ci0JCW9wNDAuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0MCA9IG5ldyBUZXN0V3JhcHBlcihvcDQwLCB0bWRFbmFibGVkLCAib3A0MCIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDEgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgdHJ1ZSxmYWxzZSk7IC8vIGZvcmNlCi0JCW9wNDEuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0MSA9IG5ldyBUZXN0V3JhcHBlcihvcDQxLCB0bWRFbmFibGVkLCAib3A0MSIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDIgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmFsc2UsZmFsc2UpOyAvLyBubyBmb3JjZQotCQlvcDQyLnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NDIgPSBuZXcgVGVzdFdyYXBwZXIob3A0MiwgdG1kRW5hYmxlZCwgIm9wNDIiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDQzID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHRydWUsIGZhbHNlKTsgLy8gZm9yY2UsIG5vIGZvcmsKLQkJb3A0My5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQzID0gbmV3IFRlc3RXcmFwcGVyKG9wNDMsIHRtZEVuYWJsZWQsICJvcDQzIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0NCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmYWxzZSwgZmFsc2UpOyAvLyBubyBmb3JjZSwgbm8gZm9yawotCQlvcDQ0LnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NDQgPSBuZXcgVGVzdFdyYXBwZXIob3A0NCwgdG1kRW5hYmxlZCwgIm9wNDQiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDQ1ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHRydWUsIElSdWxlR3JvdXAuUEFTU19GQVNULGZhbHNlKTsgLy8gZm9yY2UKLQkJb3A0NS5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQ1ID0gbmV3IFRlc3RXcmFwcGVyKG9wNDUsIHRtZEVuYWJsZWQsICJvcDQ1IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0NiA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmYWxzZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOyAvLyBubyBmb3JjZQotCQlvcDQ2LnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NDYgPSBuZXcgVGVzdFdyYXBwZXIob3A0NiwgdG1kRW5hYmxlZCwgIm9wNDYiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDQ3ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHRydWUsIElSdWxlR3JvdXAuUEFTU19GQVNULCBmYWxzZSk7IC8vIGZvcmNlLCBubyBmb3JrCi0JCW9wNDcuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0NyA9IG5ldyBUZXN0V3JhcHBlcihvcDQ3LCB0bWRFbmFibGVkLCAib3A0NyIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDggPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmFsc2UsIElSdWxlR3JvdXAuUEFTU19GQVNULCBmYWxzZSk7IC8vIG5vIGZvcmNlLCBubyBmb3JrCi0JCW9wNDguc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0OCA9IG5ldyBUZXN0V3JhcHBlcihvcDQ4LCB0bWRFbmFibGVkLCAib3A0OCIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDkgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsZmFsc2UpOwotCQlvcDQ5LnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NDkgPSBuZXcgVGVzdFdyYXBwZXIob3A0OSwgdG1kRW5hYmxlZCwgIm9wNDkiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDUwID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsZmFsc2UpOwotCQlvcDUwLnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NTAgPSBuZXcgVGVzdFdyYXBwZXIob3A1MCwgdG1kSW5jLCAib3A1MCIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTEgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsZmFsc2UpOwotCQlvcDUxLnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NTEgPSBuZXcgVGVzdFdyYXBwZXIob3A1MSwgdG1kRW1wdHksICJvcDUxIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1MiA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgbnVsbCwgZmFsc2UpOyAvLyBmYWxzZT1hdXRvQnVpbGQgZGlzYWJsZWQKLQkJb3A1Mi5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDUyID0gbmV3IFRlc3RXcmFwcGVyKG9wNTIsIHRtZEVuYWJsZWQsICJvcDUyIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1MyA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgbnVsbCwgdHJ1ZSk7IC8vIHRydWU9YXV0b0J1aWxkIGVuYWJsZWQKLQkJb3A1My5zZXRWYWxpZGF0b3JzKGZ1bGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1MyA9IG5ldyBUZXN0V3JhcHBlcihvcDUzLCB0bWRGdWxsLCAib3A1MyIsIGZ1bGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDU0ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIGZhbHNlKTsgLy8gZmFsc2U9YXV0b0J1aWxkIGRpc2FibGVkCi0JCW9wNTQuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1NCA9IG5ldyBUZXN0V3JhcHBlcihvcDU0LCB0bWRJbmMsICJvcDU0IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1NSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLCB0cnVlKTsgLy8gdHJ1ZT1hdXRvQnVpbGQgZW5hYmxlZAotCQlvcDU1LnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NTUgPSBuZXcgVGVzdFdyYXBwZXIob3A1NSwgdG1kRW1wdHksICJvcDU1IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1NiA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSwgZmFsc2UpOyAvLyBmYWxzZT1hdXRvQnVpbGQgZGlzYWJsZWQKLQkJb3A1Ni5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDU2ID0gbmV3IFRlc3RXcmFwcGVyKG9wNTYsIHRtZEVtcHR5LCAib3A1NiIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTcgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsIHRydWUpOyAvLyB0cnVlPWF1dG9CdWlsZCBlbmFibGVkCi0JCW9wNTcuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1NyA9IG5ldyBUZXN0V3JhcHBlcihvcDU3LCB0bWRFbXB0eSwgIm9wNTciLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDU4ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLG51bGwsIElSdWxlR3JvdXAuUEFTU19GQVNULGZhbHNlKTsgLy8gZmFsc2U9YXV0b0J1aWxkIGRpc2FibGVkCi0JCW9wNTguc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1OCA9IG5ldyBUZXN0V3JhcHBlcihvcDU4LCB0bWRFbmFibGVkLCAib3A1OCIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTkgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsIElSdWxlR3JvdXAuUEFTU19GQVNULGZhbHNlKTsgLy8gdHJ1ZT1hdXRvQnVpbGQgZW5hYmxlZAotCQlvcDU5LnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NTkgPSBuZXcgVGVzdFdyYXBwZXIob3A1OSwgdG1kRnVsbCwgIm9wNTkiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDYwID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULGZhbHNlKTsgLy8gZmFsc2U9YXV0b0J1aWxkIGRpc2FibGVkCi0JCW9wNjAuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q2MCA9IG5ldyBUZXN0V3JhcHBlcihvcDYwLCB0bWRJbmMsICJvcDYwIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2MSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7IC8vIHRydWU9YXV0b0J1aWxkIGVuYWJsZWQKLQkJb3A2MS5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDYxID0gbmV3IFRlc3RXcmFwcGVyKG9wNjEsIHRtZEVtcHR5LCAib3A2MSIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjIgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOyAvLyBmYWxzZT1hdXRvQnVpbGQgZGlzYWJsZWQKLQkJb3A2Mi5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDYyID0gbmV3IFRlc3RXcmFwcGVyKG9wNjIsIHRtZEVtcHR5LCAib3A2MiIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjMgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsSVJ1bGVHcm91cC5QQVNTX0ZBU1QsdHJ1ZSk7IC8vIHRydWU9YXV0b0J1aWxkIGVuYWJsZWQKLQkJb3A2My5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDYzID0gbmV3IFRlc3RXcmFwcGVyKG9wNjMsIHRtZEVtcHR5LCAib3A2MyIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjQgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksbnVsbCxJUnVsZUdyb3VwLlBBU1NfRkFTVCx0cnVlKTsKLQkJb3A2NC5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDY0ID0gbmV3IFRlc3RXcmFwcGVyKG9wNjQsIHRtZEVuYWJsZWQsICJvcDY0IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2NSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCx0cnVlKTsKLQkJb3A2NS5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDY1ID0gbmV3IFRlc3RXcmFwcGVyKG9wNjUsIHRtZEluYywgIm9wNjUiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDY2ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCx0cnVlKTsKLQkJb3A2Ni5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDY2ID0gbmV3IFRlc3RXcmFwcGVyKG9wNjYsIHRtZEVtcHR5LCAib3A2NiIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmKGNoYW5nZWRDbGFzc2VzICE9IG51bGwpIHsKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDY3ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGNoYW5nZWRSZXNvdXJjZXMsZmFsc2UpOwotCQkJb3A2Ny5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NjcgPSBuZXcgVGVzdFdyYXBwZXIob3A2NywgdG1kSmF2YSwgIm9wNjciLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDY4ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGNoYW5nZWRSZXNvdXJjZXMsIGZhbHNlKTsgLy8gbm8gZm9yawotCQkJb3A2OC5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NjggPSBuZXcgVGVzdFdyYXBwZXIob3A2OCwgdG1kSmF2YSwgIm9wNjgiLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDY5ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGRlZmF1bHRFeHRlbnNpb24sIGNoYW5nZWRSZXNvdXJjZXMsZmFsc2UpOwotCQkJb3A2OS5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NjkgPSBuZXcgVGVzdFdyYXBwZXIob3A2OSwgdG1kSmF2YSwgIm9wNjkiLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDcwID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGRlZmF1bHRFeHRlbnNpb24sIGNoYW5nZWRSZXNvdXJjZXMsIGZhbHNlKTsgLy8gbm8gZm9yawotCQkJb3A3MC5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NzAgPSBuZXcgVGVzdFdyYXBwZXIob3A3MCwgdG1kSmF2YSwgIm9wNzAiLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDcxID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGVtcHR5UmVzb3VyY2VzLGZhbHNlKTsKLQkJCW9wNzEuc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDcxID0gbmV3IFRlc3RXcmFwcGVyKG9wNzEsIHRtZEVtcHR5LCAib3A3MSIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzIgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgZW1wdHlSZXNvdXJjZXMsIGZhbHNlKTsgLy8gbm8gZm9yawotCQkJb3A3Mi5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NzIgPSBuZXcgVGVzdFdyYXBwZXIob3A3MiwgdG1kRW1wdHksICJvcDcyIiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A3MyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBkZWZhdWx0RXh0ZW5zaW9uLCBlbXB0eVJlc291cmNlcyxmYWxzZSk7Ci0JCQlvcDczLnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3MyA9IG5ldyBUZXN0V3JhcHBlcihvcDczLCB0bWRFbXB0eSwgIm9wNzMiLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDc0ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGRlZmF1bHRFeHRlbnNpb24sIGVtcHR5UmVzb3VyY2VzLCBmYWxzZSk7IC8vIG5vIGZvcmsKLQkJCW9wNzQuc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDc0ID0gbmV3IFRlc3RXcmFwcGVyKG9wNzQsIHRtZEVtcHR5LCAib3A3NCIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzUgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgY2hhbmdlZENsYXNzZXMsZmFsc2UpOwotCQkJb3A3NS5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NzUgPSBuZXcgVGVzdFdyYXBwZXIob3A3NSwgdG1kSmF2YSwgIm9wNzUiLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDc2ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGNoYW5nZWRDbGFzc2VzLCBmYWxzZSk7IC8vIG5vIGZvcmsKLQkJCW9wNzYuc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDc2ID0gbmV3IFRlc3RXcmFwcGVyKG9wNzYsIHRtZEphdmEsICJvcDc2IiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A3NyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBkZWZhdWx0RXh0ZW5zaW9uLCBjaGFuZ2VkQ2xhc3NlcyxmYWxzZSk7Ci0JCQlvcDc3LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3NyA9IG5ldyBUZXN0V3JhcHBlcihvcDc3LCB0bWRKYXZhLCAib3A3NyIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzggPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgZGVmYXVsdEV4dGVuc2lvbiwgY2hhbmdlZENsYXNzZXMsIGZhbHNlKTsgLy8gbm8gZm9yawotCQkJb3A3OC5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NzggPSBuZXcgVGVzdFdyYXBwZXIob3A3OCwgdG1kSmF2YSwgIm9wNzgiLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVRlc3RXcmFwcGVyW10gcmVzdWx0ID0gbmV3IFRlc3RXcmFwcGVyW10gewotCQkJCXRlc3QxLCB0ZXN0MiwgdGVzdDMsIHRlc3Q0LCB0ZXN0NSwgdGVzdDYsIHRlc3Q3LCB0ZXN0OCwgdGVzdDksCi0JCQkJdGVzdDEwLCB0ZXN0MTEsIHRlc3QxMiwgdGVzdDEzLCB0ZXN0MTQsIHRlc3QxNSwgdGVzdDE2LCB0ZXN0MTcsIHRlc3QxOCwgdGVzdDE5LAotCQkJCXRlc3QyMCwgdGVzdDIxLCB0ZXN0MjIsIHRlc3QyMywgdGVzdDI0LCB0ZXN0MjUsIHRlc3QyNiwgdGVzdDI3LCB0ZXN0MjgsIHRlc3QyOSwKLQkJCQl0ZXN0MzAsIHRlc3QzMSwgdGVzdDMyLCB0ZXN0MzMsIHRlc3QzNCwgdGVzdDM1LCB0ZXN0MzYsIHRlc3QzNywgdGVzdDM4LCB0ZXN0MzksCi0JCQkJdGVzdDQwLCB0ZXN0NDEsIHRlc3Q0MiwgdGVzdDQzLCB0ZXN0NDQsIHRlc3Q0NSwgdGVzdDQ2LCB0ZXN0NDcsIHRlc3Q0OCwgdGVzdDQ5LAotCQkJCXRlc3Q1MCwgdGVzdDUxLCB0ZXN0NTIsIHRlc3Q1MywgdGVzdDU0LCB0ZXN0NTUsIHRlc3Q1NiwgdGVzdDU3LCB0ZXN0NTgsIHRlc3Q1OSwKLQkJCQl0ZXN0NjAsIHRlc3Q2MSwgdGVzdDYyLCB0ZXN0NjMsIHRlc3Q2NCwgdGVzdDY1LCB0ZXN0NjYsIHRlc3Q2NywgdGVzdDY4LCB0ZXN0NjksCi0JCQkJdGVzdDcwLCB0ZXN0NzEsIHRlc3Q3MiwgdGVzdDczLCB0ZXN0NzQsIHRlc3Q3NSwgdGVzdDc2LCB0ZXN0NzcsIHRlc3Q3OAotCQkJfTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlUZXN0V3JhcHBlcltdIHJlc3VsdCA9IG5ldyBUZXN0V3JhcHBlcltdIHsKLQkJCQl0ZXN0MSwgdGVzdDIsIHRlc3QzLCB0ZXN0NCwgdGVzdDUsIHRlc3Q2LCB0ZXN0NywgdGVzdDgsIHRlc3Q5LAotCQkJCXRlc3QxMCwgdGVzdDExLCB0ZXN0MTIsIHRlc3QxMywgdGVzdDE0LCB0ZXN0MTUsIHRlc3QxNiwgdGVzdDE3LCB0ZXN0MTgsIHRlc3QxOSwKLQkJCQl0ZXN0MjAsIHRlc3QyMSwgdGVzdDIyLCB0ZXN0MjMsIHRlc3QyNCwgdGVzdDI1LCB0ZXN0MjYsIHRlc3QyNywgdGVzdDI4LCB0ZXN0MjksCi0JCQkJdGVzdDMwLCB0ZXN0MzEsIHRlc3QzMiwgdGVzdDMzLCB0ZXN0MzQsIHRlc3QzNSwgdGVzdDM2LCB0ZXN0MzcsIHRlc3QzOCwgdGVzdDM5LAotCQkJCXRlc3Q0MCwgdGVzdDQxLCB0ZXN0NDIsIHRlc3Q0MywgdGVzdDQ0LCB0ZXN0NDUsIHRlc3Q0NiwgdGVzdDQ3LCB0ZXN0NDgsIHRlc3Q0OSwKLQkJCQl0ZXN0NTAsIHRlc3Q1MSwgdGVzdDUyLCB0ZXN0NTMsIHRlc3Q1NCwgdGVzdDU1LCB0ZXN0NTYsIHRlc3Q1NywgdGVzdDU4LCB0ZXN0NTksCi0JCQkJdGVzdDYwLCB0ZXN0NjEsIHRlc3Q2MiwgdGVzdDYzLCB0ZXN0NjQsIHRlc3Q2NSwgdGVzdDY2Ci0JCQl9OwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0V3JhcHBlciB7Ci0JCXByaXZhdGUgTGlzdCBfbWVzc2FnZXMgPSBudWxsOwotCQlwcml2YXRlIFZhbGlkYXRpb25PcGVyYXRpb24gX29wZXJhdGlvbiA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIF90ZXN0TmFtZSA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nW10gX3ZhbGlkYXRvck5hbWVzID0gbnVsbDsKLQkJCi0JCVRlc3RXcmFwcGVyKFZhbGlkYXRpb25PcGVyYXRpb24gb3AsIExpc3QgZXhwZWN0ZWRNZXNzYWdlcywgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmdbXSB2YWxpZGF0b3JOYW1lcykgewotCQkJX21lc3NhZ2VzID0gZXhwZWN0ZWRNZXNzYWdlczsKLQkJCV9vcGVyYXRpb24gPSBvcDsKLQkJCV90ZXN0TmFtZSA9IHRlc3ROYW1lOwotCQkJX3ZhbGlkYXRvck5hbWVzID0gdmFsaWRhdG9yTmFtZXM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0IGdldEV4cGVjdGVkTWVzc2FnZXMoKSB7Ci0JCQlyZXR1cm4gX21lc3NhZ2VzOwotCQl9Ci0JCQotCQlwdWJsaWMgVmFsaWRhdGlvbk9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKSB7Ci0JCQlyZXR1cm4gX29wZXJhdGlvbjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIF90ZXN0TmFtZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRvck5hbWVzKCkgewotCQkJcmV0dXJuIF92YWxpZGF0b3JOYW1lczsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1ZBTEZXSzAyT3BlcmF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVkFMRldLMDJPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmOWNmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVkFMRldLMDJPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2s7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5JT3BlcmF0aW9uUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5WYWxpZGF0aW9uVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkpEVFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5HbG9iYWxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRhc2tMaXN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcnVucyB0aGUgVkFMRldLMDIgdGVzdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZBTEZXSzAyT3BlcmF0aW9uIGltcGxlbWVudHMgSU9wZXJhdGlvblJ1bm5hYmxlIHsKLQlwcml2YXRlIElQcm9qZWN0IF9wcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIElCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3Rlc3RDYXNlTmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkVXTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE11c3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yIGluIG9yZGVyIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24uCi0JICogTVVTVCBjYWxsIHNldEJ1ZmZlciwgc2V0UHJvamVjdCwgYW5kIHNldE5hbWUgYmVmb3JlIHVzaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIFZBTEZXSzAyT3BlcmF0aW9uKCkgewotCX0KLQkKLQkvKioKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqLwotCXB1YmxpYyBWQUxGV0swMk9wZXJhdGlvbihJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHRlc3RDYXNlTmFtZSkgewotCQlzZXRQcm9qZWN0KHByb2plY3QpOwotCQlzZXRCdWZmZXIoYnVmZmVyKTsKLQkJc2V0TmFtZSh0ZXN0Q2FzZU5hbWUpOwotCX0KLQotCXB1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHsgCi0JCXJldHVybiBfYnVmZmVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoSUJ1ZmZlciBiKSB7Ci0JCV9idWZmZXIgPSBiOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHApIHsKLQkJX3Byb2plY3QgPSBwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIF90ZXN0Q2FzZU5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJX3Rlc3RDYXNlTmFtZSA9IG5hbWU7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJaWYocHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSdW4gVkFMRldLMDIgb24gYW4gZXhpc3Rpbmcgb3BlbiBJUHJvamVjdC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQkvLyBGaXJzdCwgYWRkIHRoZSBWYWxpZGF0aW9uQnVpbGRlciB0byB0aGUgSmF2YSBQcm9qZWN0Ci0JCVZhbGlkYXRvck1hbmFnZXIuYWRkUHJvamVjdEJ1aWxkVmFsaWRhdGlvblN1cHBvcnQocHJvamVjdCk7Ci0KLQkJLy8gU2F2ZSB0aGUgb2xkIHVzZXIgY29uZmlndXJhdGlvbiBhbmQgcmVzdG9yZSBpdCBpbiB0aGUgZmluYWxseSBibG9jay4KLQkJdHJ5IHsKLQkJCUdsb2JhbENvbmZpZ3VyYXRpb24gZ2NvbmYgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcGNvbmYgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIG9yaWdHY29uZiA9IG5ldyBHbG9iYWxDb25maWd1cmF0aW9uKGdjb25mKTsgLy8gY29weSB0aGUgb3JpZ2luYWwgdmFsdWVzIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVzdG9yZWQgaW4gdGhlIGZpbmFsbHkgYmxvY2sKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIG9yaWdQY29uZiA9IG5ldyBQcm9qZWN0Q29uZmlndXJhdGlvbihwY29uZik7IC8vIGNvcHkgdGhlIG9yaWdpbmFsIHZhbHVlcyBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlc3RvcmVkIGluIHRoZSBmaW5hbGx5IGJsb2NrCi0JCQlib29sZWFuIGF1dG9CdWlsZEVuYWJsZWQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKTsKLQkJCQkKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gY29uZmlndXJlZFZhbGlkYXRvcnMgPSBwY29uZi5nZXRWYWxpZGF0b3JzKCk7Ci0JCQlpZihjb25maWd1cmVkVmFsaWRhdG9ycy5sZW5ndGggPCAyKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCJSdW4gVkFMRldLMDIgb24gYW4gZXhpc3Rpbmcgb3BlbiBwcm9qZWN0IHRoYXQgaGFzIGF0IGxlYXN0IHR3byB2YWxpZGF0b3JzIGNvbmZpZ3VyZWQ6IG9uZSB0byBlbmFibGUsIGFuZCBvbmUgdG8gZGlzYWJsZS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gRGlzYWJsZSBhdCBsZWFzdCBvbmUgdmFsaWRhdG9yIGZvciB0aGlzIHRlc3QuCi0JCQkvLyBSZW1vdmUgdGhlIGZpcnN0IGVuYWJsZWQgdmFsaWRhdG9yIGZyb20gdGhlIFByb3BlcnRpZXMsIGFuZCB0aGUgc2Vjb25kIGVuYWJsZWQgdmFsaWRhdG9yIGZyb20gdGhlCi0JCQkvLyBQcmVmZXJlbmNlcy4gKEl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHZhbGlkYXRvciBpcyByZW1vdmVkOyBpdCBvbmx5IG1hdHRlcnMgdGhhdCB0aGUgUHJvcGVydGllcyBhbmQKLQkJCS8vIHRoZSBQcmVmZXJlbmNlcyBoYXZlIGRpZmZlcmVudCB2YWxpZGF0b3JzLikKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZmVGVzdFZhbGlkYXRvciA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5GV0tfTk9CVUlMRF9URVNUX1ZBTElEQVRPUl9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZmTm9CdWlsZFRlc3RWYWxpZGF0b3IgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uRldLX1RFU1RfVkFMSURBVE9SX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQkJVmFsaWRhdG9yTWV0YURhdGEgcHJvcGVydGllc1ZhbGlkYXRvciA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5QUk9QRVJUSUVTX1ZBTElEQVRPUl9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZFByb3BWYWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhWzJdOwotCQkJZW5hYmxlZFByb3BWYWxpZGF0b3JzWzBdID0gdmZUZXN0VmFsaWRhdG9yOwotCQkJZW5hYmxlZFByb3BWYWxpZGF0b3JzWzFdID0gdmZOb0J1aWxkVGVzdFZhbGlkYXRvcjsKLQkJCXBjb25mLnNldEVuYWJsZWRWYWxpZGF0b3JzKGVuYWJsZWRQcm9wVmFsaWRhdG9ycyk7Ci0JCQkvL3Bjb25mLnNldE1heGltdW1OdW1iZXJPZk1lc3NhZ2VzKDEpOwotCQkJcGNvbmYucGFzc2l2YXRlKCk7Ci0KLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZFByZWZWYWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhWzFdOwotCQkJZW5hYmxlZFByZWZWYWxpZGF0b3JzWzBdID0gcHJvcGVydGllc1ZhbGlkYXRvcjsKLQkJCWdjb25mLnNldEVuYWJsZWRWYWxpZGF0b3JzKGVuYWJsZWRQcmVmVmFsaWRhdG9ycyk7Ci0JCQkvL2djb25mLnNldE1heGltdW1OdW1iZXJPZk1lc3NhZ2VzKDEwKTsKLQkJCWdjb25mLnBhc3NpdmF0ZSgpOwotCQkJCi0JCQkKLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gdG1kcyA9IEpEVFV0aWxpdHkuZ2V0VkZUZXN0cyhtb25pdG9yLCBnZXRQcm9qZWN0KCkpOwotCQkJaWYoKHRtZHMgPT0gbnVsbCkgfHwgKHRtZHMubGVuZ3RoID09IDApKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCJDYW5ub3QgcnVuIFZBTEZXSzAyIGJlY2F1c2UgdGhlcmUgYXJlIG5vIHRlc3QgY2FzZXMgcmVnaXN0ZXJlZCBmb3IgSmF2YVByb2plY3QuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCVZhbGlkYXRvclRlc3RjYXNlIGZ3a05vYnVpbGRUZXN0VE1EID0gbnVsbDsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIGZ3a1Rlc3RUTUQgPSBudWxsOwotCQkJVmFsaWRhdG9yVGVzdGNhc2UgcHJvcFRNRCA9IG51bGw7Ci0JCQlmb3IoaW50IGk9MDsgaTx0bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gdG1kc1tpXTsKLQkJCQlpZih0bWQuZ2V0VmFsaWRhdG9yQ2xhc3MoKS5lcXVhbHMoVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uRldLX1RFU1RfVkFMSURBVE9SX0NMQVNTKSkgewotCQkJCQlmd2tUZXN0VE1EID0gdG1kOwotCQkJCX0KLQkJCQllbHNlIGlmKHRtZC5nZXRWYWxpZGF0b3JDbGFzcygpLmVxdWFscyhUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5QUk9QRVJUSUVTX1ZBTElEQVRPUl9DTEFTUykpIHsKLQkJCQkJcHJvcFRNRCA9IHRtZDsKLQkJCQl9Ci0JCQkJZWxzZSBpZih0bWQuZ2V0VmFsaWRhdG9yQ2xhc3MoKS5lcXVhbHMoVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uRldLX05PQlVJTERfVEVTVF9WQUxJREFUT1JfQ0xBU1MpKSB7Ci0JCQkJCWZ3a05vYnVpbGRUZXN0VE1EID0gdG1kOwotCQkJCX0KLQkJCQkKLQkJCQlpZigoZndrVGVzdFRNRCAhPSBudWxsKSAmJiAocHJvcFRNRCAhPSBudWxsKSAmJiAoZndrTm9idWlsZFRlc3RUTUQgIT0gbnVsbCkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZigoZndrVGVzdFRNRCA9PSBudWxsKSB8fCAocHJvcFRNRCA9PSBudWxsKSB8fCAoZndrTm9idWlsZFRlc3RUTUQgPT0gbnVsbCkpIHsKLQkJCQkvLyBDYW4ndCBydW4gdGhlIHRlc3RzCi0JCQkJbW9uaXRvci5zdWJUYXNrKCJDYW5ub3QgcnVuIFZBTEZXSzAyIGJlY2F1c2UgdGhlIHRlc3QgY2FzZSBpcyBtaXNzaW5nIGZvciBlaXRoZXIgdGhlIFZGIFRlc3QgVmFsaWRhdG9yLCBQcm9wZXJ0aWVzIFZhbGlkYXRvciwgb3IgYm90aC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQkvLyBTZXQgbGV2ZWwgdG8gRklORVNUIHNvIHRoYXQgdGhlIGxhdW5jaCB2YWxpZGF0b3JzIGFyZSBhY2N1bXVsYXRlZCBpbiBWYWxpZGF0aW9uT3BlcmF0aW9uLgotCQkJCS8vIChTZWUgVmFsaWRhdGlvbk9wZXJhdGlvbjo6Z2V0TGF1bmNoZWRWYWxpZGF0b3JzKCkpCi0JCQkJVHJhY2luZy5zZXRGb3JjZUxvZ2dpbmcodHJ1ZSk7Ci0JCQkJCi0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoInRlc3RQcm9wTm90T3ZlcnJpZGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWludCBhbGxvd1Bhc3MgPSB0ZXN0UHJvcE5vdE92ZXJyaWRlKG1vbml0b3IsIHByb2plY3QsIGdjb25mLCBwY29uZiwgcHJvcFRNRCk7Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoTkVXTElORSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRCdWZmZXIoKS53cml0ZSgidGVzdFByb3BPdmVycmlkZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IHByb3BQYXNzID0gdGVzdFByb3BPdmVycmlkZShtb25pdG9yLCBwcm9qZWN0LCBnY29uZiwgcGNvbmYsIGZ3a1Rlc3RUTUQpOwotCQkJCWdldEJ1ZmZlcigpLndyaXRlKE5FV0xJTkUpOyAvLyROT04tTkxTLTEkCi0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoInRlc3RQcmVmTm90QWxsb3dPdmVycmlkZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IG5vdEFsbG93UGFzcyA9IHRlc3RQcmVmTm90QWxsb3dPdmVycmlkZShtb25pdG9yLCBwcm9qZWN0LCBnY29uZiwgcGNvbmYsIHByb3BUTUQpOwotCQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKE5FV0xJTkUpOwotCQkJCXJlc3VsdC5hcHBlbmQoIlByb3BlcnRpZXMgRG9lc24ndCBPdmVycmlkZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKGFsbG93UGFzcyk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiIG9mIDcgcGFzcy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoTkVXTElORSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiUHJvcGVyaXRlcyBPdmVycmlkZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChwcm9wUGFzcyk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiIG9mIDcgcGFzcy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoTkVXTElORSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiUHJlZmVyZW5jZSBEb2Vzbid0IEFsbG93IE92ZXJyaWRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQobm90QWxsb3dQYXNzKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCIgb2YgNyBwYXNzLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChORVdMSU5FKTsKLQkJCQltb25pdG9yLnN1YlRhc2socmVzdWx0LnRvU3RyaW5nKCkpOwotCQkJCWdldEJ1ZmZlcigpLndyaXRlKE5FV0xJTkUpOyAvLyROT04tTkxTLTEkCi0JCQkJZ2V0QnVmZmVyKCkud3JpdGUocmVzdWx0LnRvU3RyaW5nKCkpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZ2NvbmYgPSBvcmlnR2NvbmY7Ci0JCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQkJCi0JCQkJcGNvbmYgPSBvcmlnUGNvbmY7Ci0JCQkJcGNvbmYucGFzc2l2YXRlKCk7Ci0JCQkJCi0JCQkJSkRUVXRpbGl0eS5zZXRBdXRvQnVpbGQoYXV0b0J1aWxkRW5hYmxlZCk7Ci0JCi0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZGVidWcoSUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0aXRsZSwgVmFsaWRhdG9yTWV0YURhdGFbXSBlbmFibGVkVmFsaWRhdG9ycykgewotCQlidWZmZXIud3JpdGUoIkNvbnRlbnRzIG9mICIgKyB0aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yKGludCBpPTA7IGk8ZW5hYmxlZFZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IGVuYWJsZWRWYWxpZGF0b3JzW2ldOwotCQkJYnVmZmVyLndyaXRlKCJcdCIgKyB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlidWZmZXIud3JpdGUoIkVuZCBjb250ZW50cyBvZiAiICsgdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci53cml0ZShORVdMSU5FKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkKLQlwcml2YXRlIGludCB0ZXN0UHJvcE5vdE92ZXJyaWRlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSVByb2plY3QgcHJvamVjdCwgR2xvYmFsQ29uZmlndXJhdGlvbiBnY29uZiwgUHJvamVjdENvbmZpZ3VyYXRpb24gcGNvbmYsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCkgewotCQlpbnQgbnVtUGFzcyA9IDA7Ci0JCXRyeSB7Ci0JCQkvLyBTZXQgdXAgdGhlIHVzZXIgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRlc3QuIFRoZSBydW4oSVByb2dyZXNzTW9uaXRvcikgbWV0aG9kCi0JCQkvLyB3aWxsIHNldCB0aGUgdmFsdWVzIGJhY2sgdG8gd2hhdCB0aGV5IHdlcmUgYmVmb3JlIHRoZSB0ZXN0LgkJCi0JCQlnY29uZi5zZXRDYW5Qcm9qZWN0c092ZXJyaWRlKHRydWUpOwotCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQlwY29uZi5zZXREb2VzUHJvamVjdE92ZXJyaWRlKGZhbHNlKTsKLQkJCXBjb25mLnBhc3NpdmF0ZSgpOwotCQkJCi0JCQlWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS51cGRhdGVUYXNrTGlzdChwcm9qZWN0KTsgLy8gVXBkYXRlIHRoZSB0YXNrIGxpc3QgYmVjYXVzZSB0aGUgcHJlZmVyZW5jZSBhbmQgcHJvcGVydGllcyBwYWdlIGRvLCBzbyB0aGUgY29uZmlndXJhdGlvbiBjbGFzc2VzIGRvbid0LgotCQkJCi0JCQlkZWJ1ZyhnZXRCdWZmZXIoKSwgIkVuYWJsZWQgUHJvcGVydGllcyBWYWxpZGF0b3JzIiwgcGNvbmYuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRlYnVnKGdldEJ1ZmZlcigpLCAiRW5hYmxlZCBQcmVmZXJlbmNlIFZhbGlkYXRvcnMiLCBnY29uZi5nZXRFbmFibGVkVmFsaWRhdG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCQotCQkJbnVtUGFzcyA9IHZhbGlkYXRlKG1vbml0b3IsIHByb2plY3QsIGdjb25mLCB0bWQsICJ0ZXN0UHJvcE5vdE92ZXJyaWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQludW1QYXNzID0gMDsKLQkJfQotCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCW51bVBhc3MgPSAwOwotCQl9Ci0JCQotCQkJcmV0dXJuIG51bVBhc3M7Ci0JfQotCQotCQotCXByaXZhdGUgaW50IHRlc3RQcm9wT3ZlcnJpZGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBHbG9iYWxDb25maWd1cmF0aW9uIGdjb25mLCBQcm9qZWN0Q29uZmlndXJhdGlvbiBwY29uZiwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kKSB7Ci0JCWludCBudW1QYXNzID0gMDsKLQkJdHJ5IHsKLQkJCS8vIFNldCB1cCB0aGUgdXNlciBjb25maWd1cmF0aW9uIGZvciB0aGUgdGVzdC4gVGhlIHJ1bihJUHJvZ3Jlc3NNb25pdG9yKSBtZXRob2QKLQkJCS8vIHdpbGwgc2V0IHRoZSB2YWx1ZXMgYmFjayB0byB3aGF0IHRoZXkgd2VyZSBiZWZvcmUgdGhlIHRlc3QuCQkKLQkJCWdjb25mLnNldENhblByb2plY3RzT3ZlcnJpZGUodHJ1ZSk7Ci0JCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCXBjb25mLnNldERvZXNQcm9qZWN0T3ZlcnJpZGUodHJ1ZSk7Ci0JCQlwY29uZi5wYXNzaXZhdGUoKTsKLQotCQkJVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkudXBkYXRlVGFza0xpc3QocHJvamVjdCk7IC8vIFVwZGF0ZSB0aGUgdGFzayBsaXN0IGJlY2F1c2UgdGhlIHByZWZlcmVuY2UgYW5kIHByb3BlcnRpZXMgcGFnZSBkbywgc28gdGhlIGNvbmZpZ3VyYXRpb24gY2xhc3NlcyBkb24ndC4KLQkJCQotCQkJZGVidWcoZ2V0QnVmZmVyKCksICJFbmFibGVkIFByb3BlcnRpZXMgVmFsaWRhdG9ycyIsIHBjb25mLmdldEVuYWJsZWRWYWxpZGF0b3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCQlkZWJ1ZyhnZXRCdWZmZXIoKSwgIkVuYWJsZWQgUHJlZmVyZW5jZSBWYWxpZGF0b3JzIiwgZ2NvbmYuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCW51bVBhc3MgPSB2YWxpZGF0ZShtb25pdG9yLCBwcm9qZWN0LCBwY29uZiwgdG1kLCAidGVzdFByb3BPdmVycmlkZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudW1QYXNzOwotCX0KLQkKLQlwcml2YXRlIGludCB0ZXN0UHJlZk5vdEFsbG93T3ZlcnJpZGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBHbG9iYWxDb25maWd1cmF0aW9uIGdjb25mLCBQcm9qZWN0Q29uZmlndXJhdGlvbiBwY29uZiwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kKSB7Ci0JCWludCBudW1QYXNzID0gMDsKLQkJdHJ5IHsKLQkJCS8vIFNldCB1cCB0aGUgdXNlciBjb25maWd1cmF0aW9uIGZvciB0aGUgdGVzdC4gVGhlIHJ1bihJUHJvZ3Jlc3NNb25pdG9yKSBtZXRob2QKLQkJCS8vIHdpbGwgc2V0IHRoZSB2YWx1ZXMgYmFjayB0byB3aGF0IHRoZXkgd2VyZSBiZWZvcmUgdGhlIHRlc3QuCQkKLQkJCWdjb25mLnNldENhblByb2plY3RzT3ZlcnJpZGUoZmFsc2UpOwotCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQlwY29uZi5zZXREb2VzUHJvamVjdE92ZXJyaWRlKHRydWUpOwotCQkJcGNvbmYucGFzc2l2YXRlKCk7Ci0KLQkJCVZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLnVwZGF0ZVRhc2tMaXN0KHByb2plY3QpOyAvLyBVcGRhdGUgdGhlIHRhc2sgbGlzdCBiZWNhdXNlIHRoZSBwcmVmZXJlbmNlIGFuZCBwcm9wZXJ0aWVzIHBhZ2UgZG8sIHNvIHRoZSBjb25maWd1cmF0aW9uIGNsYXNzZXMgZG9uJ3QuCi0JCQkKLQkJCWRlYnVnKGdldEJ1ZmZlcigpLCAiRW5hYmxlZCBQcm9wZXJ0aWVzIFZhbGlkYXRvcnMiLCBwY29uZi5nZXRFbmFibGVkVmFsaWRhdG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCQkJZGVidWcoZ2V0QnVmZmVyKCksICJFbmFibGVkIFByZWZlcmVuY2UgVmFsaWRhdG9ycyIsIGdjb25mLmdldEVuYWJsZWRWYWxpZGF0b3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCi0JCQludW1QYXNzID0gdmFsaWRhdGUobW9uaXRvciwgcHJvamVjdCwgZ2NvbmYsIHRtZCwgInRlc3RQcmVmTm90QWxsb3dPdmVycmlkZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudW1QYXNzOwotCX0KLQkKLQlwcml2YXRlIGludCB2YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mLCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQsIFN0cmluZyB0ZXN0TmFtZSkgewotCQlpbnQgbnVtUGFzcyA9IDA7Ci0JCWJvb2xlYW4gc3VjY2Vzc2Z1bCA9IHRydWU7IC8vIEFzc3VtZSB0aGF0IGFsbCBvZiB0aGUgdGVzdCBjYXNlcyB3aWxsIHBhc3MuCi0JCXRyeSB7Ci0JCQkvLyBGb3IgdGhlIGZpcnN0IGZvdXIgdGVzdHMsIG5lZWQgYWxsIG9mIHRoZSBtZXNzYWdlcyB0byBiZSByZXBvcnRlZAotCQkJLy9pbnQgb3JpZ2luYWxMaW1pdCA9IHZjb25mLmdldE1heGltdW1OdW1iZXJPZk1lc3NhZ2VzKCk7Ci0JCQkvL3Zjb25mLnNldE1heGltdW1OdW1iZXJPZk1lc3NhZ2VzKFdvcmtiZW5jaFJlcG9ydGVyLk5PX01FU1NBR0VfTElNSVQpOwotCQkJdmNvbmYucGFzc2l2YXRlKCk7Ci0JCQkKLQkJCWJvb2xlYW4gcGFzcyA9IHJ1blZhbGlkYXRpb24obW9uaXRvciwgcHJvamVjdCwgdmNvbmYpOwotCQkJaWYoIXBhc3MpIHsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6cnVuVmFsaWRhdGlvbiBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3NmdWwgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW51bVBhc3MrKzsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6cnVuVmFsaWRhdGlvbiBwYXNzZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZ2V0QnVmZmVyKCkuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgIjo6IiArIHRlc3ROYW1lICsgInJ1blZhbGlkYXRpb24iLCBwYXNzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkKLQkJCXBhc3MgPSBmdWxsQnVpbGRWYWxpZGF0ZShtb25pdG9yLCBwcm9qZWN0LCB2Y29uZiwgdG1kKTsKLQkJCWlmKCFwYXNzKSB7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmZ1bGxCdWlsZFZhbGlkYXRpb24gZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdWNjZXNzZnVsID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQludW1QYXNzKys7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmZ1bGxCdWlsZFZhbGlkYXRpb24gcGFzc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksICI6OiIgKyB0ZXN0TmFtZSArICJmdWxsQnVpbGRWYWxpZGF0aW9uIiwgcGFzcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlwYXNzID0gYXV0b1ZhbGlkYXRlRW5hYmxlZChtb25pdG9yLCBwcm9qZWN0LCB2Y29uZiwgdG1kKTsKLQkJCWlmKCFwYXNzKSB7Ci0JCQkJc3VjY2Vzc2Z1bCA9IGZhbHNlOwotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjphdXRvVmFsaWRhdGVFbmFibGVkIGZhaWxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQludW1QYXNzKys7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmF1dG9WYWxpZGF0ZUVuYWJsZWQgcGFzc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksICI6OiIgKyB0ZXN0TmFtZSArICJhdXRvVmFsaWRhdGVFbmFibGVkIiwgcGFzcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlwYXNzID0gYXV0b1ZhbGlkYXRlRGlzYWJsZWQobW9uaXRvciwgcHJvamVjdCwgdmNvbmYsIHRtZCk7Ci0JCQlpZighcGFzcykgewotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjphdXRvVmFsaWRhdGVEaXNhYmxlZCBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3NmdWwgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW51bVBhc3MrKzsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6YXV0b1ZhbGlkYXRlRGlzYWJsZWQgcGFzc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksICI6OiIgKyB0ZXN0TmFtZSArICJhdXRvVmFsaWRhdGVEaXNhYmxlZCIsIHBhc3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQotCQkJcGFzcyA9IGJ1aWxkVmFsaWRhdGVFbmFibGVkKG1vbml0b3IsIHByb2plY3QsIHZjb25mLCB0bWQpOwotCQkJaWYoIXBhc3MpIHsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6YnVpbGRWYWxpZGF0ZUVuYWJsZWQgZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdWNjZXNzZnVsID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQludW1QYXNzKys7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmJ1aWxkVmFsaWRhdGVFbmFibGVkIHBhc3NlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlnZXRCdWZmZXIoKS5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCAiOjoiICsgdGVzdE5hbWUgKyAiYnVpbGRWYWxpZGF0ZUVuYWJsZWQiLCBwYXNzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXBhc3MgPSBidWlsZFZhbGlkYXRlRGlzYWJsZWQobW9uaXRvciwgcHJvamVjdCwgdmNvbmYsIHRtZCk7Ci0JCQlpZighcGFzcykgewotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjpidWlsZFZhbGlkYXRlRGlzYWJsZWQgZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdWNjZXNzZnVsID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQludW1QYXNzKys7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmJ1aWxkVmFsaWRhdGVEaXNhYmxlZCBwYXNzZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZ2V0QnVmZmVyKCkuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgIjo6IiArIHRlc3ROYW1lICsgImJ1aWxkVmFsaWRhdGVEaXNhYmxlZCIsIHBhc3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJLy8gQW5kIGZvciB0aGlzIHRlc3QsIHRoZSBvcmlnaW5hbCBsaW1pdCBuZWVkcyB0byBiZSBlbmZvcmNlZAotCQkJLy92Y29uZi5zZXRNYXhpbXVtTnVtYmVyT2ZNZXNzYWdlcyhvcmlnaW5hbExpbWl0KTsKLQkJCXZjb25mLnBhc3NpdmF0ZSgpOwotCi0JCQlwYXNzID0gbWF4TWVzc2FnZXNSZXBvcnRlZChtb25pdG9yLCBwcm9qZWN0LCB2Y29uZik7Ci0JCQlpZighcGFzcykgewotCQkJCXN1Y2Nlc3NmdWwgPSBmYWxzZTsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6bWF4TWVzc2FnZXNSZXBvcnRlZCBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbnVtUGFzcysrOwotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjptYXhNZXNzYWdlc1JlcG9ydGVkIHBhc3NlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlnZXRCdWZmZXIoKS5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCAiOjoiICsgdGVzdE5hbWUgKyAibWF4TWVzc2FnZXNSZXBvcnRlZCIsIHBhc3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJc3VjY2Vzc2Z1bCA9IGZhbHNlOwotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlnZXRCdWZmZXIoKS5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCB0ZXN0TmFtZSwgc3VjY2Vzc2Z1bCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVtUGFzczsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJ1blZhbGlkYXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB2Y29uZikgewotCQlib29sZWFuIHBhc3NlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQkvLyBVbmxpa2UgdGhlIG90aGVyIHZhbGlkYXRpb25zLCB3aGljaCByZWx5IG9uIGEgYnVpbGQsIHRoaXMgbWV0aG9kIGhhcyBhY2Nlc3MgdG8gdGhlCi0JCQkvLyBvcGVyYXRpb24gYW5kIGNhbiBxdWVyeSBpdCBmb3IgdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycyB0aGF0IHdlcmUgbGF1bmNoZWQuIFRoaXMgdGVjaG5pcXVlCi0JCQkvLyBpcyBiZXR0ZXIgYmVjYXVzZSBpdCBkb2Vzbid0IHJlbHkgb24gdGhlIHZhbGlkYXRvciBwcm9kdWNpbmcgdGhlIGNvcnJlY3Qgb3V0cHV0IChtYXJrZXJzKS4KLQkJCS8vIFZBTEZXSzAyIGp1c3Qgd2FudHMgdG8gY2hlY2sgdGhhdCB0aGUgY29ycmVjdCB2YWxpZGF0b3JzIHdlcmUgbGF1bmNoZWQ7IHRoZSBUZXN0T3BDb25zdHIKLQkJCS8vIHRlc3Qgd2FudHMgdG8gY2hlY2sgdGhlIHJlc3VsdCBnaXZlbiBkaWZmZXJlbnQgb3V0cHV0IGFuZCBjb25zdHJ1Y3RvciBvZiB0aGUgT3BlcmF0aW9uLgotCQkJCi0JCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiB2YWxpZE9wID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKHByb2plY3QsZmFsc2UpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih2YWxpZE9wLCBtb25pdG9yKTsKLQkJCS8vIExhdW5jaGVkIHZhbGlkYXRvcnMgc2hvdWxkIGJlIGNvbmZpZ3VyZWQsIGVuYWJsZWQsIGFuZCBoYWQgZmlsZXMgdG8gdmFsaWRhdGUgb24gdGhlIHByb2plY3QuCi0JCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGxhdW5jaGVkVmFsaWRhdG9ycyA9IHZhbGlkT3AuZ2V0TGF1bmNoZWRWYWxpZGF0b3JzKCk7Ci0JCQkKLQkJCS8vIFNpbmNlIGEgZnVsbCB2YWxpZGF0aW9uIHdhcyBydW4sIHRoZSBsYXVuY2hlZCB2YWxpZGF0b3JzIHNob3VsZCBiZSBlcXVpdmFsZW50Ci0JCQkvLyB0byB0aGUgY29uZmlndXJlZCBlbmFibGVkIHZhbGRpYXRvcnMuCi0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWYWxpZGF0b3JzID0gdmNvbmYuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLQkJCWZvcihpbnQgaT0wOyBpPGVuYWJsZWRWYWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZW5hYmxlZFZhbGlkYXRvcnNbaV07Ci0JCQkJCi0JCQkJLy8gSWYgaXQncyBjb25maWd1cmVkIG9uIHRoZSBwcm9qZWN0LCBlbnN1cmUgdGhhdCB0aGUgZW5hYmxlZCB2YWxpZGF0b3Igd2FzIGxhdW5jaGVkLgotCQkJCS8vIChNYXkgbm90IGJlIGNvbmZpZ3VyZWQgaWYgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyBpcyB0aGUgbGlzdCBvZiBQcmVmZXJlbmNlIGVuYWJsZWQKLQkJCQkvLyB2YWxpZGF0b3JzLikKLQkJCQlpZighbGF1bmNoZWRWYWxpZGF0b3JzLmNvbnRhaW5zKHZtZCkpIHsKLQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUoIkVSUk9SOiBFeHBlY3RlZCB2YWxpZGF0b3IgIiArIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpICsgIiB3YXMgbm90IHJ1biBvbiBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIuIEZhaWxpbmcgdGVzdC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiSU5GTzogRXhwZWN0ZWQgdmFsaWRhdG9yICIgKyB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSArICIgcmFuIGFzIGV4cGVjdGVkIG9uIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKHBhc3NlZCA9PSBmYWxzZSkgewotCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJsYXVuY2hlZCB2YWxpZGF0b3JzIGFyZSB0aGUgZm9sbG93aW5nOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IGxhdW5jaGVkVmFsaWRhdG9ycykgewotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiXHQiICsgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJlbmQgb2YgbGF1bmNoZWQgdmFsaWRhdG9ycyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcGFzc2VkID0gZmFsc2U7Ci0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZ1bGxCdWlsZFZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmNvbmYsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCkgewotCQl0cnkgewotCQkJLy92Y29uZi5zZXRCdWlsZFZhbGlkYXRlKHRydWUpOwotCQkJdmNvbmYucGFzc2l2YXRlKCk7Ci0KLQkJCVRhc2tMaXN0VXRpbGl0eS5yZW1vdmVBbGxUYXNrcyhwcm9qZWN0KTsKLQkJCUlSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMgPSB0bWQuZ2V0UmVzb3VyY2VzKHByb2plY3QpOzsKLQkJCVRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLnRvdWNoKHByb2plY3QsIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJCi0JCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbW9uaXRvcik7Ci0JCQlJTWFya2VyW10gbWVzc2FnZXNBZnRlckJ1aWxkID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBJTWVzc2FnZS5BTExfTUVTU0FHRVMpOwotCQkJCi0JCQlyZXR1cm4gQlZUUnVubmVyLnNpbmdsZXRvbigpLmNvbXBhcmUoZ2V0QnVmZmVyKCksIGdldE5hbWUoKSwgdG1kLmdldE5hbWUoKSwgdG1kLmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5GVUxMX1ZBTElEQVRJT04pLCBtZXNzYWdlc0FmdGVyQnVpbGQpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGF1dG9WYWxpZGF0ZUVuYWJsZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB2Y29uZiwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kKSB7Ci0JCUpEVFV0aWxpdHkuc2V0QXV0b0J1aWxkKHRydWUpOwotCQkKLQkJdHJ5IHsKLQkJCS8vdmNvbmYuc2V0QXV0b1ZhbGlkYXRlKHRydWUpOwotCQkJdmNvbmYucGFzc2l2YXRlKCk7Ci0JCQkKLQkJCVRhc2tMaXN0VXRpbGl0eS5yZW1vdmVBbGxUYXNrcyhwcm9qZWN0KTsKLQkJCUlSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMgPSB0bWQuZ2V0UmVzb3VyY2VzKHByb2plY3QpOzsKLQkJCVRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLnRvdWNoKHByb2plY3QsIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJCi0JCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQVVUT19CVUlMRCwgbW9uaXRvcik7Ci0JCQlJTWFya2VyW10gbWVzc2FnZXNBZnRlckJ1aWxkID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBJTWVzc2FnZS5BTExfTUVTU0FHRVMpOwotCQkJCi0JCQlyZXR1cm4gQlZUUnVubmVyLnNpbmdsZXRvbigpLmNvbXBhcmUoZ2V0QnVmZmVyKCksIGdldE5hbWUoKSwgdG1kLmdldE5hbWUoKSwgdG1kLmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5BVVRPX1ZBTElEQVRJT04pLCBtZXNzYWdlc0FmdGVyQnVpbGQpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGF1dG9WYWxpZGF0ZURpc2FibGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmNvbmYsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCkgewotCQlKRFRVdGlsaXR5LnNldEF1dG9CdWlsZCh0cnVlKTsKLQotCQl0cnkgewkJCi0JCQkvL3Zjb25mLnNldEF1dG9WYWxpZGF0ZShmYWxzZSk7Ci0JCQl2Y29uZi5wYXNzaXZhdGUoKTsKLQotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHByb2plY3QpOwotCQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IHRtZC5nZXRSZXNvdXJjZXMocHJvamVjdCk7Ci0JCQlUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi50b3VjaChwcm9qZWN0LCBjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCi0JCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQVVUT19CVUlMRCwgbW9uaXRvcik7Ci0JCQlJTWFya2VyW10gbWVzc2FnZXNBZnRlckJ1aWxkID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBJTWVzc2FnZS5BTExfTUVTU0FHRVMpOwotCQkJCi0JCQkvLyBQYXNzIGluIGFuIGVtcHR5IGxpc3QgYmVjYXVzZSB0aGUgdmFsaWRhdGlvbiBpc24ndCBzdXBwb3NlZCB0byBydW4uCi0JCQlyZXR1cm4gQlZUUnVubmVyLnNpbmdsZXRvbigpLmNvbXBhcmUoZ2V0QnVmZmVyKCksIGdldE5hbWUoKSwgdG1kLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgbWVzc2FnZXNBZnRlckJ1aWxkKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBidWlsZFZhbGlkYXRlRW5hYmxlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mLCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQpIHsKLQkJdHJ5IHsKLQkJCS8vdmNvbmYuc2V0QnVpbGRWYWxpZGF0ZSh0cnVlKTsKLQkJCXZjb25mLnBhc3NpdmF0ZSgpOwotCQkJSkRUVXRpbGl0eS5zZXRBdXRvQnVpbGQoZmFsc2UpOwotCQotCQkJLy8gQ29uc3RydWN0IHRoZSBpbnB1dAotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHByb2plY3QpOwotCQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IHRtZC5nZXRSZXNvdXJjZXMocHJvamVjdCk7Ci0JCQlUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi50b3VjaChwcm9qZWN0LCBjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCXRyeSB7CQkKLQkJCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG1vbml0b3IpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlJTWFya2VyW10gbWVzc2FnZXNBZnRlckJ1aWxkID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBJTWVzc2FnZS5BTExfTUVTU0FHRVMpOwotCQkJCi0JCQlyZXR1cm4gQlZUUnVubmVyLnNpbmdsZXRvbigpLmNvbXBhcmUoZ2V0QnVmZmVyKCksIGdldE5hbWUoKSwgdG1kLmdldE5hbWUoKSwgdG1kLmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OKSwgbWVzc2FnZXNBZnRlckJ1aWxkKTsKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVmFsaWRhdGVEaXNhYmxlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mLCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQpIHsKLQkJdHJ5IHsKLQkJCS8vdmNvbmYuc2V0QnVpbGRWYWxpZGF0ZShmYWxzZSk7Ci0JCQl2Y29uZi5wYXNzaXZhdGUoKTsKLQkJCUpEVFV0aWxpdHkuc2V0QXV0b0J1aWxkKGZhbHNlKTsKLQkJCQotCQkJLy8gQ29uc3RydWN0IHRoZSBpbnB1dAotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHByb2plY3QpOwotCQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IHRtZC5nZXRSZXNvdXJjZXMocHJvamVjdCk7Ci0JCQlUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi50b3VjaChwcm9qZWN0LCBjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCXRyeSB7CQkKLQkJCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG1vbml0b3IpOwotCQkJCUlNYXJrZXJbXSBtZXNzYWdlc0FmdGVyQnVpbGQgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0KLQkJCQkvLyBQYXNzIGluIGFuIGVtcHR5IGxpc3QgYmVjYXVzZSB2YWxpZGF0aW9uIGlzbid0IHN1cHBvc2VkIHRvIHJ1bi4JCQkJCi0JCQkJcmV0dXJuIEJWVFJ1bm5lci5zaW5nbGV0b24oKS5jb21wYXJlKGdldEJ1ZmZlcigpLCBnZXROYW1lKCksIHRtZC5nZXROYW1lKCksIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG1lc3NhZ2VzQWZ0ZXJCdWlsZCk7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG1heE1lc3NhZ2VzUmVwb3J0ZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB2Y29uZikgewotCQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gdmFsaWRPcCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXZhbGlkT3AgPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24ocHJvamVjdCxmYWxzZSk7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih2YWxpZE9wLCBtb25pdG9yKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi19Ci0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9Gd2tOb0J1aWxkVGVzdEhlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9Gd2tOb0J1aWxkVGVzdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWQzZGY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrTm9CdWlsZFRlc3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb24uQVdvcmtiZW5jaE1PRkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEZ3a05vQnVpbGRUZXN0SGVscGVyIGV4dGVuZHMgQVdvcmtiZW5jaE1PRkhlbHBlciB7Ci0JCi0JcHVibGljIEZ3a05vQnVpbGRUZXN0SGVscGVyKCkgewotCQlzdXBlcigpOwotCQkKLQkJcmVnaXN0ZXJNb2RlbChGd2tUZXN0VmFsaWRhdG9yLkFMTF9GSUxFUywgImxvYWRBbGxGaWxlcyIpOyAvLyROT04tTkxTLTEkCi0JCXJlZ2lzdGVyTW9kZWwoRndrVGVzdFZhbGlkYXRvci5KQVZBSEVMUEVSUywgImxvYWRKYXZhSGVscGVycyIsIG5ldyBDbGFzc1tde0lGaWxlRGVsdGEuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRlLklXb3JrYmVuY2hIZWxwZXIjZ2V0VGFyZ2V0T2JqZWN0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3QgYXJnMCkgewotCQkvLyBObyB0YXJnZXQgb2JqZWN0cyBvdXRzaWRlIG9mIGFuIElSZXNvdXJjZSBhcmUgdXNlZCwgdGhlcmVmb3JlIG5vIHRhcmdldCBvYmplY3QgbmFtZXMgYXJlIG5lZWRlZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElGaWxlRGVsdGFbXSBsb2FkQWxsRmlsZXMoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCQotCQlmaW5hbCBTZXQgZmlsZXMgPSBuZXcgSGFzaFNldCgpOwotCQlJUmVzb3VyY2VWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlVmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlpZighcmVzLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsgLy8gaWYgdGhlIHJlc291cmNlIGlzbid0IGFjY2Vzc2libGUgdGhlbiBuZWl0aGVyIGFyZSBpdHMgY2hpbGRyZW4KLQkJCQl9Ci0JCQkJCi0JCQkJaWYoKHJlcyBpbnN0YW5jZW9mIElGaWxlKSAmJiAoImphdmEiLmVxdWFscyhyZXMuZ2V0RmlsZUV4dGVuc2lvbigpKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlXb3JrYmVuY2hGaWxlRGVsdGEgbmV3RmlsZURlbHRhID0gbmV3IFdvcmtiZW5jaEZpbGVEZWx0YShyZXMuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBJRmlsZURlbHRhLkNIQU5HRUQsIHJlcyk7Ci0JCQkJCWZpbGVzLmFkZChuZXdGaWxlRGVsdGEpOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOyAvLyB2aXNpdCB0aGUgcmVzb3VyY2UncyBjaGlsZHJlbiBhcyB3ZWxsCi0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCXByb2plY3QuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgdHJ1ZSk7IC8vIHRydWUgbWVhbnMgaW5jbHVkZSBwaGFudG9tIHJlc291cmNlcwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCUlGaWxlRGVsdGFbXSByZXN1bHQgPSBuZXcgSUZpbGVEZWx0YVtmaWxlcy5zaXplKCldOwotCQlmaWxlcy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBKYXZhSGVscGVycyBsb2FkSmF2YUhlbHBlcnMoSUZpbGVEZWx0YSBkZWx0YSkgewotCQlXb3JrYmVuY2hGaWxlRGVsdGEgZmQgPSAoV29ya2JlbmNoRmlsZURlbHRhKWRlbHRhOwotCQlJUmVzb3VyY2UgcmVzdWx0ID0gZmQuZ2V0UmVzb3VyY2UoKTsKLQkJaWYocmVzdWx0ICE9IG51bGwpewotCQkJaWYocmVzdWx0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlyZXR1cm4gSkRUVXRpbGl0eS5nZXRKYXZhSGVscGVycygoSUZpbGUpcmVzdWx0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gVGhpcyB2YWxpZGF0b3IgdmFsaWRhdGVzIG9ubHkgLmphdmEgZmlsZXMsIHNvIHRoaXMKLQkJCS8vIG11c3QgYmUgYW4gaW5zdGFuY2VvZiBKYXZhQ2xhc3MuCi0JCQlyZXR1cm4gKEphdmFIZWxwZXJzKWZkLmdldE9iamVjdCgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGUuSVdvcmtiZW5jaEhlbHBlciNnZXRSZXNvdXJjZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQlJUmVzb3VyY2UgcmVzdWx0ID0gc3VwZXIuZ2V0UmVzb3VyY2Uob2JqZWN0KTsKLQkJaWYoKHJlc3VsdCAhPSBudWxsKSAmJiAocmVzdWx0LmV4aXN0cygpKSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIEphdmFIZWxwZXJzKSB7Ci0JCQkvLyBJZiB0aGUgbWVzc2FnZSB3YXMgYWRkZWQgdG8gYSBKYXZhSGVscGVycywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCi0JCQlyZXR1cm4gSkRUVXRpbGl0eS5nZXRSZXNvdXJjZShnZXRQcm9qZWN0KCksIChKYXZhSGVscGVycykgb2JqZWN0KTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFdvcmtiZW5jaEZpbGVEZWx0YSkgewotCQkJLy8gSWYgdGhlIHdvcmtiZW5jaCBpcyByZW1vdmluZyBtZXNzYWdlcyBmcm9tIGZpbGVzLCBhbmQgdGhlIG9iamVjdCBpcyBzZXQKLQkJCS8vIGluc3RlYWQgb2YgdGhlIElSZXNvdXJjZSwgbmVlZCB0byBwcm9jZXNzIHRoZSBkZWx0YSdzIG9iamVjdCBpbnN0ZWFkIG9mCi0JCQkvLyBpdHMgcmVzb3VyY2UuCi0JCQlyZXR1cm4gSkRUVXRpbGl0eS5nZXRSZXNvdXJjZShnZXRQcm9qZWN0KCksIChKYXZhSGVscGVycykoKFdvcmtiZW5jaEZpbGVEZWx0YSlvYmplY3QpLmdldE9iamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5BV29ya2JlbmNoSGVscGVyI2dldExpbmVObyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZU5vKE9iamVjdCBvYmplY3QpIHsKLQkJaW50IGxpbmVObyA9IHN1cGVyLmdldExpbmVObyhvYmplY3QpOwotCQlpZihsaW5lTm8gPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSB7Ci0JCQkvLyBObyBhZGFwdGVycywgc28gZnVkZ2UgdGhlIGxpbmUgbnVtYmVyIGJ5IGFkZGluZyB0aGUgbWVzc2FnZSB0byB0aGUgZmlyc3QgbGluZSBpbiB0aGUgZmlsZS4KLQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiBsaW5lTm87Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a05vQnVpbGRUZXN0VmFsaWRhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a05vQnVpbGRUZXN0VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjQyZjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9Gd2tOb0J1aWxkVGVzdFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTG9jYWxpemVkTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIEZ3a05vQnVpbGRUZXN0VmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0ZJTEVTID0gIkFMTF9GSUxFUyI7IC8vIExvYWQgYWxsIElGaWxlRGVsdGFzIGZvciB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IHByb2plY3QuIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBSEVMUEVSUyA9ICJKQVZBSEVMUEVSUyI7IC8vIFRoZSBKYXZhQ2xhc3MgdGhhdCB0aGUgSUZpbGVEZWx0YSBtYXBzIHRvLiAvLyROT04tTkxTLTEkCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklWYWxpZGF0b3IjY2xlYW51cChjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklSZXBvcnRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBOb3RoaW5nIGlzIGNhY2hlZCwgc28gbm90aGluZyB0byBkby4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklWYWxpZGF0b3IjdmFsaWRhdGUoY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JSGVscGVyLCBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklSZXBvcnRlciwgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JRmlsZURlbHRhW10pCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlGaWxlRGVsdGFbXSBkZWx0YSA9IG51bGwgOwotCQlpZigoZGVsdGEgPT0gbnVsbCkgfHwgKGRlbHRhLmxlbmd0aCA9PTApKSB7Ci0JCQkvLyBGdWxsIFZhbGlkYXRlCi0JCQlkZWx0YSA9IChJRmlsZURlbHRhW10paGVscGVyLmxvYWRNb2RlbChBTExfRklMRVMpOwotCQl9Ci0JCQotCQlpZihkZWx0YSA9PSBudWxsKSB7Ci0JCQkvLyBQcm9ibGVtIGxvYWRpbmcgdGhlIGZpbGVzCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZvcihpbnQgaT0wOyBpPGRlbHRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlKYXZhSGVscGVycyB0YXJnZXQgPSAoSmF2YUhlbHBlcnMpaGVscGVyLmxvYWRNb2RlbChKQVZBSEVMUEVSUywgbmV3IE9iamVjdFtde2RlbHRhW2ldfSk7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksICJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIHJlcG9ydGVkIGJ5IFZGIE5vQnVpbGQgVGVzdCBWYWxpZGF0b3IuIFBsZWFzZSBpZ25vcmUuIiwgdGFyZ2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9Gd2tUZXN0SGVscGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a1Rlc3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3NGU1NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a1Rlc3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLkFXb3JrYmVuY2hNT0ZIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBGd2tUZXN0SGVscGVyIGV4dGVuZHMgQVdvcmtiZW5jaE1PRkhlbHBlciB7Ci0JCi0JcHVibGljIEZ3a1Rlc3RIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQlyZWdpc3Rlck1vZGVsKEZ3a1Rlc3RWYWxpZGF0b3IuQUxMX0ZJTEVTLCAibG9hZEFsbEZpbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJNb2RlbChGd2tUZXN0VmFsaWRhdG9yLkpBVkFIRUxQRVJTLCAibG9hZEphdmFIZWxwZXJzIiwgbmV3IENsYXNzW117SUZpbGVEZWx0YS5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGUuSVdvcmtiZW5jaEhlbHBlciNnZXRUYXJnZXRPYmplY3ROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCBhcmcwKSB7Ci0JCS8vIE5vIHRhcmdldCBvYmplY3RzIG91dHNpZGUgb2YgYW4gSVJlc291cmNlIGFyZSB1c2VkLCB0aGVyZWZvcmUgbm8gdGFyZ2V0IG9iamVjdCBuYW1lcyBhcmUgbmVlZGVkLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUZpbGVEZWx0YVtdIGxvYWRBbGxGaWxlcygpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCi0JCWZpbmFsIFNldCBmaWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWlmKCFyZXMuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBpZiB0aGUgcmVzb3VyY2UgaXNuJ3QgYWNjZXNzaWJsZSB0aGVuIG5laXRoZXIgYXJlIGl0cyBjaGlsZHJlbgotCQkJCX0KLQkJCQkKLQkJCQlpZigocmVzIGluc3RhbmNlb2YgSUZpbGUpICYmICggKHJlcy5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgJiYgcmVzLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoImphdmEiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlXb3JrYmVuY2hGaWxlRGVsdGEgbmV3RmlsZURlbHRhID0gbmV3IFdvcmtiZW5jaEZpbGVEZWx0YShyZXMuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBJRmlsZURlbHRhLkNIQU5HRUQsIHJlcyk7Ci0JCQkJCWZpbGVzLmFkZChuZXdGaWxlRGVsdGEpOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOyAvLyB2aXNpdCB0aGUgcmVzb3VyY2UncyBjaGlsZHJlbiBhcyB3ZWxsCi0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCXByb2plY3QuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgdHJ1ZSk7IC8vIHRydWUgbWVhbnMgaW5jbHVkZSBwaGFudG9tIHJlc291cmNlcwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCUlGaWxlRGVsdGFbXSByZXN1bHQgPSBuZXcgSUZpbGVEZWx0YVtmaWxlcy5zaXplKCldOwotCQlmaWxlcy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBKYXZhSGVscGVycyBsb2FkSmF2YUhlbHBlcnMoSUZpbGVEZWx0YSBkZWx0YSkgewotCQlXb3JrYmVuY2hGaWxlRGVsdGEgZmQgPSAoV29ya2JlbmNoRmlsZURlbHRhKWRlbHRhOwotCQlJUmVzb3VyY2UgcmVzdWx0ID0gZmQuZ2V0UmVzb3VyY2UoKTsKLQkJaWYocmVzdWx0ICE9IG51bGwpewotCQkJaWYocmVzdWx0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlyZXR1cm4gSkRUVXRpbGl0eS5nZXRKYXZhSGVscGVycygoSUZpbGUpcmVzdWx0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gVGhpcyB2YWxpZGF0b3IgdmFsaWRhdGVzIG9ubHkgLmphdmEgZmlsZXMsIHNvIHRoaXMKLQkJCS8vIG11c3QgYmUgYW4gaW5zdGFuY2VvZiBKYXZhQ2xhc3MuCi0JCQlyZXR1cm4gKEphdmFIZWxwZXJzKWZkLmdldE9iamVjdCgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGUuSVdvcmtiZW5jaEhlbHBlciNnZXRSZXNvdXJjZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQlJUmVzb3VyY2UgcmVzdWx0ID0gc3VwZXIuZ2V0UmVzb3VyY2Uob2JqZWN0KTsKLQkJaWYoKHJlc3VsdCAhPSBudWxsKSAmJiAocmVzdWx0LmV4aXN0cygpKSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIEphdmFIZWxwZXJzKSB7Ci0JCQkvLyBJZiB0aGUgbWVzc2FnZSB3YXMgYWRkZWQgdG8gYSBKYXZhSGVscGVycywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCi0JCQlyZXR1cm4gSkRUVXRpbGl0eS5nZXRSZXNvdXJjZShnZXRQcm9qZWN0KCksIChKYXZhSGVscGVycykgb2JqZWN0KTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFdvcmtiZW5jaEZpbGVEZWx0YSkgewotCQkJLy8gSWYgdGhlIHdvcmtiZW5jaCBpcyByZW1vdmluZyBtZXNzYWdlcyBmcm9tIGZpbGVzLCBhbmQgdGhlIG9iamVjdCBpcyBzZXQKLQkJCS8vIGluc3RlYWQgb2YgdGhlIElSZXNvdXJjZSwgbmVlZCB0byBwcm9jZXNzIHRoZSBkZWx0YSdzIG9iamVjdCBpbnN0ZWFkIG9mCi0JCQkvLyBpdHMgcmVzb3VyY2UuCi0JCQlyZXR1cm4gSkRUVXRpbGl0eS5nZXRSZXNvdXJjZShnZXRQcm9qZWN0KCksIChKYXZhSGVscGVycykoKFdvcmtiZW5jaEZpbGVEZWx0YSlvYmplY3QpLmdldE9iamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5BV29ya2JlbmNoSGVscGVyI2dldExpbmVObyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZU5vKE9iamVjdCBvYmplY3QpIHsKLQkJaW50IGxpbmVObyA9IHN1cGVyLmdldExpbmVObyhvYmplY3QpOwotCQlpZihsaW5lTm8gPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSB7Ci0JCQkvLyBObyBhZGFwdGVycywgc28gZnVkZ2UgdGhlIGxpbmUgbnVtYmVyIGJ5IGFkZGluZyB0aGUgbWVzc2FnZSB0byB0aGUgZmlyc3QgbGluZSBpbiB0aGUgZmlsZS4KLQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiBsaW5lTm87Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a1Rlc3RWYWxpZGF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrVGVzdFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDFmYWJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrVGVzdFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTG9jYWxpemVkTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIEZ3a1Rlc3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfRklMRVMgPSAiQUxMX0ZJTEVTIjsgLy8gTG9hZCBhbGwgSUZpbGVEZWx0YXMgZm9yIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgcHJvamVjdC4gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFIRUxQRVJTID0gIkpBVkFIRUxQRVJTIjsgLy8gVGhlIEphdmFDbGFzcyB0aGF0IHRoZSBJRmlsZURlbHRhIG1hcHMgdG8uIC8vJE5PTi1OTFMtMSQKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVZhbGlkYXRvciNjbGVhbnVwKGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVJlcG9ydGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIE5vdGhpbmcgaXMgY2FjaGVkLCBzbyBub3RoaW5nIHRvIGRvLgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVZhbGlkYXRvciN2YWxpZGF0ZShjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklIZWxwZXIsIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVJlcG9ydGVyLCBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklGaWxlRGVsdGFbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJSUZpbGVEZWx0YVtdIGRlbHRhID0gbnVsbDsKLQkJaWYoKGRlbHRhID09IG51bGwpIHx8IChkZWx0YS5sZW5ndGggPT0wKSkgewotCQkJLy8gRnVsbCBWYWxpZGF0ZQotCQkJZGVsdGEgPSAoSUZpbGVEZWx0YVtdKWhlbHBlci5sb2FkTW9kZWwoQUxMX0ZJTEVTKTsKLQkJfQotCQkKLQkJaWYoZGVsdGEgPT0gbnVsbCkgewotCQkJLy8gUHJvYmxlbSBsb2FkaW5nIHRoZSBmaWxlcwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlmb3IoaW50IGk9MDsgaTxkZWx0YS5sZW5ndGg7IGkrKykgewotCQkJSmF2YUhlbHBlcnMgdGFyZ2V0ID0gKEphdmFIZWxwZXJzKWhlbHBlci5sb2FkTW9kZWwoSkFWQUhFTFBFUlMsIG5ldyBPYmplY3RbXXtkZWx0YVtpXX0pOwotCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCAiVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCByZXBvcnRlZCBieSBWRiBUZXN0IFZhbGlkYXRvci4gUGxlYXNlIGlnbm9yZS4iLCB0YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0pEVFV0aWxpdHkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvSkRUVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzk2ZjFjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvSkRUVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLlRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHNvbWUgdXRpbGl0eSBtZXRob2RzIHVzZWQgdG8gCi0gKiBhY2Nlc3MsIG1hbmlwdWxhdGUsIGV0Yy4gamR0IHR5cGVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSkRUVXRpbGl0eSB7Ci0JcHJpdmF0ZSBKRFRVdGlsaXR5KCkgewotCQkvLyBEbyBub3QgbmVlZCBhbnkgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVycyBpbiB0aGUgZ2l2ZW4gcHJvamVjdCB0aGF0IGNvbnRhaW4gZWl0aGVyCi0JICogLmphdmEgc291cmNlIGZpbGVzIG9yIC5jbGFzcyBiaW5hcnkgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyW10gZ2V0SmF2YUNvbnRhaW5lcnMoSUphdmFQcm9qZWN0IGpwKSB7Ci0JCWlmIChqcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBqcC5nZXRQcm9qZWN0KCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljbGFzc3BhdGggPSBqcC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpZ25vcmUgdW5yZXNvbHZlZCAobWlzc2luZykgdmFyaWFibGVzLCBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbgotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBUcmF2ZXJzZSB0aGUgY2xhc3NwYXRoLCBhbmQgY2FsY3VsYXRlIGEgbGlzdCBvZiBqdXN0IHRoZSAKLQkJLy8gSUZvbGRlcnMgYW5kIElQcm9qZWN0cyAoaS5lLiwgSUNvbnRhaW5lcnMpIHRoYXQgY29udGFpbiBzb3VyY2UKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlDb250YWluZXJbXSBpY29udGFpbmVycyA9IG5ldyBJQ29udGFpbmVyW2NsYXNzcGF0aC5sZW5ndGhdOwotCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlJUmVzb3VyY2UgcmVzID0gcm9vdC5maW5kTWVtYmVyKGVudHJ5LmdldFBhdGgoKSk7Ci0JCQkJaWYocmVzID09IG51bGwpIHsKLQkJCQkJLy8gbm90IGluIHRoZSB3b3Jrc3BhY2UKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYoIXJlcy5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKSB7Ci0JCQkJCS8vIGluIGEgZGlmZmVyZW50IHByb2plY3QKLQkJCQkJY29udGludWU7Ci0JCQkJfQkJCQkKLQotCQkJCWlmIChyZXMgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCWljb250YWluZXJzW3ZhbGlkQ291bnQrK10gPSAoSUNvbnRhaW5lcikgcmVzOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlJQ29udGFpbmVyIG91dHB1dENvbnRhaW5lciA9IChJQ29udGFpbmVyKXJvb3QuZmluZE1lbWJlcihqcC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCUlDb250YWluZXJbXSBjb250YWluZXJzID0gbnVsbDsKLQkJCWlmKG91dHB1dENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQkJY29udGFpbmVycyA9IG5ldyBJQ29udGFpbmVyW3ZhbGlkQ291bnRdOwotCQkJfQotCQkJZWxzZSBpZihvdXRwdXRDb250YWluZXIuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkgewotCQkJCWNvbnRhaW5lcnMgPSBuZXcgSUNvbnRhaW5lclt2YWxpZENvdW50KzFdOwotCQkJCWNvbnRhaW5lcnNbdmFsaWRDb3VudF0gPSBvdXRwdXRDb250YWluZXI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljb250YWluZXJzID0gbmV3IElDb250YWluZXJbdmFsaWRDb3VudF07Ci0JCQl9Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGljb250YWluZXJzLCAwLCBjb250YWluZXJzLCAwLCB2YWxpZENvdW50KTsKLQkJCXJldHVybiBjb250YWluZXJzOwotCQl9Ci0JCWNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSVR5cGUgdGhhdCByZXByZXNlbnRzIHRoaXMgZmlsZSwgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElUeXBlIGdldFR5cGUoSUNvbnRhaW5lcltdIGphdmFDb250YWluZXJzLCBJRmlsZSBmaWxlKSB7Ci0JCWlmKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWlmKGZpbGVFeHRlbnNpb24gPT0gbnVsbCkgewotCQkJLy8gbm90IGEgLmphdmEgb3IgYSAuY2xhc3MgZmlsZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmKCEoZmlsZUV4dGVuc2lvbi5lcXVhbHMoImphdmEiKSB8fCBmaWxlRXh0ZW5zaW9uLmVxdWFscygiY2xhc3MiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQlJSmF2YVByb2plY3QganAgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWlmKGpwID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQl0cnkgewotCQkJSVBhdGggcmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRoKGphdmFDb250YWluZXJzLCBmaWxlKTsKLQkJCWlmKHJlbGF0aXZlUGF0aCA9PSBudWxsKSB7Ci0JCQkJLy8gTm90IGEgbWVtYmVyIG9mIGEgc291cmNlIG9yIG91dHB1dCBjb250YWluZXIKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJSVBhdGggcGFja2FnZVBhdGggPSByZWxhdGl2ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZVBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKElQYXRoLlNFUEFSQVRPUiwgJy4nKTsKLQkJCVN0cmluZyB0eXBlTmFtZSA9IHJlbGF0aXZlUGF0aC5sYXN0U2VnbWVudCgpOwotCQkJdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUubGVuZ3RoKCkgLSBmaWxlRXh0ZW5zaW9uLmxlbmd0aCgpIC0gMSk7Ci0JCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IG51bGw7Ci0JCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcXVhbGlmaWVkTmFtZSA9IHBhY2thZ2VOYW1lICsgIi4iICsgdHlwZU5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcXVhbGlmaWVkTmFtZSA9IHR5cGVOYW1lOwotCQkJfQotCQkJcmV0dXJuIGpwLmZpbmRUeXBlKHF1YWxpZmllZE5hbWUpOwotCQl9Ci0JCWNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSVBhdGggb2YgdGhlIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBjb250YWluZXIgdGhhdCB0aGUKLQkgKiByZXNvdXJjZSBpcyBmb3VuZCBpbi4gSWYgdGhlIHJlc291cmNlIGlzIGNvbnRhaW5lZCBpbiBtb3JlIHRoYW4gb25lIGNvbnRhaW5lcgotCSAqIGluIHRoZSBhcnJheSwgcmV0dXJuIHRoZSBmaXJzdCBJUGF0aCBmb3VuZC4gSWYgdGhlIHJlc291cmNlIGlzIG5vdCBhIG1lbWJlcgotCSAqIG9mIGFueSBvZiB0aGUgY29udGFpbmVycywgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRSZWxhdGl2ZVBhdGgoSUNvbnRhaW5lcltdIGNvbnRhaW5lcnMsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlmb3IoaW50IGk9MDsgaTxjb250YWluZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUGF0aCBwYXRoID0gZ2V0UmVsYXRpdmVQYXRoKGNvbnRhaW5lcnNbaV0sIHJlc291cmNlKTsKLQkJCWlmKHBhdGggIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXRoOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJUGF0aCBvZiBhIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSBjb250YWluZXIuCi0JICogSWYgdGhlIElSZXNvdXJjZSBpcyBub3QgYSBtZW1iZXIgb2YgdGhlIGNvbnRhaW5lciwgcmV0dXJuIG51bGwuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UmVsYXRpdmVQYXRoKElDb250YWluZXIgY29udGFpbmVyLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKChyZXNvdXJjZSA9PSBudWxsKSB8fCAoY29udGFpbmVyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIElzIHRoZSBwYXRoIHBhcnQgb2YgdGhlIElDb250YWluZXI/Ci0JCWludCBtYXRjaGluZ0ZpcnN0U2VnbWVudHMgPSBjb250YWluZXIuZ2V0RnVsbFBhdGgoKS5tYXRjaGluZ0ZpcnN0U2VnbWVudHMocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0JCWlmKG1hdGNoaW5nRmlyc3RTZWdtZW50cyA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKG1hdGNoaW5nRmlyc3RTZWdtZW50cyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgZ2V0SmF2YUhlbHBlcnMoSUZpbGUgZmlsZSkgewotCQlJVHlwZSB0eXBlID0gZ2V0VHlwZShmaWxlKTsKLQkJaWYodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIGdldEphdmFIZWxwZXJzKHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElUeXBlIGdldFR5cGUoSUZpbGUgZmlsZSkgewotCQlJSmF2YVByb2plY3QganAgPSBKYXZhQ29yZS5jcmVhdGUoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQlJQ29udGFpbmVyW10gamF2YUNvbnRhaW5lcnMgPSAoanAgPT0gbnVsbCkgPyBudWxsIDogSkRUVXRpbGl0eS5nZXRKYXZhQ29udGFpbmVycyhqcCk7Ci0JCWlmKGphdmFDb250YWluZXJzICE9IG51bGwpIHsKLQkJCXJldHVybiBKRFRVdGlsaXR5LmdldFR5cGUoamF2YUNvbnRhaW5lcnMsIGZpbGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgZ2V0SmF2YUhlbHBlcnMoSVR5cGUgdHlwZSkgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KHR5cGUpOwotCQlpZihyZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIHJlc291cmNlU2V0KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChJVHlwZSB0eXBlKSB7Ci0JCUphdmFFTUZOYXR1cmUgbmF0dXJlID0gZ2V0TmF0dXJlKHR5cGUpOwotCQlpZihuYXR1cmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSmF2YUVNRk5hdHVyZSBnZXROYXR1cmUoSVR5cGUgdHlwZSkgewotCQlJSmF2YVByb2plY3QganAgPSB0eXBlLmdldEphdmFQcm9qZWN0KCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBqcC5nZXRQcm9qZWN0KCk7Ci0JCQotCQl0cnkgewotCQkJSmF2YUVNRk5hdHVyZSBuYXR1cmUgPSBKYXZhRU1GTmF0dXJlLmNyZWF0ZVJ1bnRpbWUocHJvamVjdCk7Ci0JCQlyZXR1cm4gbmF0dXJlOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlKElQcm9qZWN0IHByb2plY3QsIEphdmFIZWxwZXJzIGNsYXp6KSB7Ci0JCUlUeXBlIHR5cGUgPSBnZXRUeXBlKHByb2plY3QsIGNsYXp6KTsKLQkJcmV0dXJuIHR5cGUuZ2V0UmVzb3VyY2UoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElUeXBlIGdldFR5cGUoSVByb2plY3QgcHJvamVjdCwgSmF2YUhlbHBlcnMgY2xhenopIHsKLQkJaWYoY2xhenogPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUgPSBjbGF6ei5nZXRKYXZhTmFtZSgpOwotCQlJSmF2YVByb2plY3QganAgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4ganAuZmluZFR5cGUoZnVsbHlRdWFsaWZpZWROYW1lKTsKLQkJfQotCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGhyZWUgdmFsaWRhdG9yIHRlc3QgY2FzZXMgdXNlZCB0byB0ZXN0IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvclRlc3RjYXNlW10gZ2V0VkZUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0bWRzID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldEFsbFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHByb2plY3QpOwotCQlpZigodG1kcyA9PSBudWxsKSB8fCAodG1kcy5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbMF07Ci0JCX0KLQkJCi0JCVZhbGlkYXRvclRlc3RjYXNlIGZ3a05vYnVpbGRUZXN0VE1EID0gbnVsbDsKLQkJVmFsaWRhdG9yVGVzdGNhc2UgZndrVGVzdFRNRCA9IG51bGw7Ci0JCVZhbGlkYXRvclRlc3RjYXNlIHByb3BUTUQgPSBudWxsOwotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVszXTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yKGludCBpPTA7IGk8dG1kcy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gdG1kc1tpXTsKLQkJCWlmKHRtZC5nZXRWYWxpZGF0b3JDbGFzcygpLmVxdWFscyhUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5GV0tfVEVTVF9WQUxJREFUT1JfQ0xBU1MpKSB7Ci0JCQkJZndrVGVzdFRNRCA9IHRtZDsKLQkJCQlyZXN1bHRbY291bnQrK10gPSB0bWQ7Ci0JCQl9Ci0JCQllbHNlIGlmKHRtZC5nZXRWYWxpZGF0b3JDbGFzcygpLmVxdWFscyhUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5QUk9QRVJUSUVTX1ZBTElEQVRPUl9DTEFTUykpIHsKLQkJCQlwcm9wVE1EID0gdG1kOwotCQkJCXJlc3VsdFtjb3VudCsrXSA9IHRtZDsKLQkJCX0KLQkJCWVsc2UgaWYodG1kLmdldFZhbGlkYXRvckNsYXNzKCkuZXF1YWxzKFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLkZXS19OT0JVSUxEX1RFU1RfVkFMSURBVE9SX0NMQVNTKSkgewotCQkJCWZ3a05vYnVpbGRUZXN0VE1EID0gdG1kOwotCQkJCXJlc3VsdFtjb3VudCsrXSA9IHRtZDsKLQkJCX0KLQkJCQotCQkJaWYoKGZ3a1Rlc3RUTUQgIT0gbnVsbCkgJiYgKHByb3BUTUQgIT0gbnVsbCkgJiYgKGZ3a05vYnVpbGRUZXN0VE1EICE9IG51bGwpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKGNvdW50ICE9IHJlc3VsdC5sZW5ndGgpIHsKLQkJCS8vIE9uIHRoaXMgcHJvamVjdCwgbm90IGFsbCBvZiB0aGUgdGVzdCB2YWxpZGF0b3JzIGFyZSB1c2VkLgotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSByID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlW2NvdW50XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCByLCAwLCBjb3VudCk7Ci0JCQlyZXR1cm4gcjsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEF1dG9CdWlsZChib29sZWFuIGF1dG9CdWlsZEVuYWJsZWQpIHsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlkZXNjLnNldEF1dG9CdWlsZGluZyhhdXRvQnVpbGRFbmFibGVkKTsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RJbnB1dC9GV0svQlZUL29wQ29uc3RyLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdElucHV0L0ZXSy9CVlQvb3BDb25zdHIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTRiMDM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdElucHV0L0ZXSy9CVlQvb3BDb25zdHIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0SW5wdXQvUHJvcGVydGllcy9hUHJvcGVydGllcy5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RJbnB1dC9Qcm9wZXJ0aWVzL2FQcm9wZXJ0aWVzLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2ZjRjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RJbnB1dC9Qcm9wZXJ0aWVzL2FQcm9wZXJ0aWVzLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIK